8000 Factor out _extensions_cache_find_unlocked(). · python/cpython@062c66c · GitHub
[go: up one dir, main page]

Skip to content

Commit 062c66c

Browse files
Factor out _extensions_cache_find_unlocked().
1 parent 77ff3a6 commit 062c66c

File tree

1 file changed

+52
-44
lines changed

1 file changed

+52
-44
lines changed

Python/import.c

Lines changed: 52 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1005,40 +1005,53 @@ _extensions_cache_init(void)
10051005
return 0;
10061006
}
10071007

1008+
static _Py_hashtable_entry_t *
1009+
_extensions_cache_find_unlocked(PyObject *filename, PyObject *name,
1010+
void **p_key)
1011+
{
1012+
if (EXTENSIONS.hashtable == NULL) {
1013+
return NULL;
1014+
}
1015+
void *key = hashtable_key_from_2_strings(filename, name, HTSEP);
1016+
if (key == NULL) {
1017+
return NULL;
1018+
}
1019+
_Py_hashtable_entry_t *entry =
1020+
_Py_hashtable_get_entry(EXTENSIONS.hashtable, key);
1021+
if (p_key != NULL) {
1022+
*p_key = key;
1023+
}
1024+
else {
1025+
hashtable_destroy_str(key);
1026+
}
1027+
return entry;
1028+
}
1029+
10081030
static PyModuleDef *
10091031
_extensions_cache_get(PyObject *filename, PyObject *name)
10101032
{
10111033
PyModuleDef *def = NULL;
1012-
void *key = NULL;
10131034
extensions_lock_acquire();
10141035

1015-
if (EXTENSIONS.hashtable == NULL) {
1016-
goto finally;
1017-
}
1018-
1019-
key = hashtable_key_from_2_strings(filename, name, HTSEP);
1020-
if (key == NULL) {
1021-
goto finally;
1022-
}
1023-
_Py_hashtable_entry_t *entry = _Py_hashtable_get_entry(
1024-
EXTENSIONS.hashtable, key);
1036+
_Py_hashtable_entry_t *entry =
1037+
_extensions_cache_find_unlocked(filename, name, NULL);
10251038
if (entry == NULL) {
1039+
/* It was never added. */
10261040
goto finally;
10271041
}
10281042
def = (PyModuleDef *)entry->value;
10291043

10301044
finally:
10311045
extensions_lock_release();
1032-
if (key != NULL) {
1033-
PyMem_RawFree(key);
1034-
}
10351046
return def;
10361047
}
10371048

10381049
static int
1039-
_extensions_cache_set(PyObject *filename, PyObject *name, PyModuleDef *def)
1050+
_extensions_cache_set(PyObject *filename, PyObject *name, PyModuleDef *def,
1051+
bool replace)
10401052
{
10411053
int res = -1;
1054+
assert(def != NULL);
10421055
extensions_lock_acquire();
10431056

10441057
if (EXTENSIONS.hashtable == NULL) {
@@ -1047,32 +1060,33 @@ _extensions_cache_set(PyObject *filename, PyObject *name, PyModuleDef *def)
10471060
}
10481061
}
10491062

1050-
void *key = hashtable_key_from_2_strings(filename, name, HTSEP);
1051-
if (key == NULL) {
1052-
goto finally;
1053-
}
1054-
10551063
int already_set = 0;
1056-
_Py_hashtable_entry_t *entry = _Py_hashtable_get_entry(
1057-
EXTENSIONS.hashtable, key);
1064+
void *key = NULL;
1065+
_Py_hashtable_entry_t *entry =
1066+
_extensions_cache_find_unlocked(filename, name, &key);
10581067
if (entry == NULL) {
1068+
/* It was never added. */
10591069
if (_Py_hashtable_set(EXTENSIONS.hashtable, key, def) < 0) {
1060-
PyMem_RawFree(key);
10611070
PyErr_NoMemory();
10621071
goto finally;
10631072
}
1073+
/* The hashtable owns the key now. */
1074+
key = NULL;
1075+
}
1076+
else if (entry->value == NULL) {
1077+
/* It was previously deleted. */
1078+
entry->value = def;
1079+
}
1080+
/* We expect it to be static, so it must be the same pointer. */
1081+
else if ((PyModuleDef *)entry->value == def) {
1082+
/* It was already added. */
1083+
already_set = 1;
10641084
}
10651085
else {
1066-
if (entry->value == NULL) {
1067-
entry->value = def;
1068-
}
1069-
else {
1070-
/* We expect it to be static, so it must 57AE be the same pointer. */
1071-
assert((PyModuleDef *)entry->value == def);
1072-
already_set = 1;
1073-
}
1074-
PyMem_RawFree(key);
1086+
assert(replace);
1087+
entry->value = def;
10751088
}
1089+
10761090
if (!already_set) {
10771091
/* We assume that all module defs are statically allocated
10781092
and will never be freed. Otherwise, we would incref here. */
@@ -1082,27 +1096,24 @@ _extensions_cache_set(PyObject *filename, PyObject *name, PyModuleDef *def)
10821096

10831097
finally:
10841098
extensions_lock_release();
1099+
if (key != NULL) {
1100+
hashtable_destroy_str(key);
1101+
}
10851102
return res;
10861103
}
10871104

10881105
static void
10891106
_extensions_cache_delete(PyObject *filename, PyObject *name)
10901107
{
1091-
void *key = NULL;
10921108
extensions_lock_acquire();
10931109

10941110
if (EXTENSIONS.hashtable == NULL) {
10951111
/* It was never added. */
10961112
goto finally;
10971113
}
10981114

1099-
key = hashtable_key_from_2_strings(filename, name, HTSEP);
1100-
if (key == NULL) {
1101-
goto finally;
1102-
}
1103-
1104-
_Py_hashtable_entry_t *entry = _Py_hashtable_get_entry(
1105-
EXTENSIONS.hashtable, key);
1115+
_Py_hashtable_entry_t *entry =
1116+
_extensions_cache_find_unlocked(filename, name, NULL);
11061117
if (entry == NULL) {
11071118
/* It was never added. */
11081119
goto finally;
@@ -1120,9 +1131,6 @@ _extensions_cache_delete(PyObject *filename, PyObject *name)
11201131

11211132
finally:
11221133
extensions_lock_release();
1123-
if (key != NULL) {
1124-
PyMem_RawFree(key);
1125-
}
11261134
}
11271135

11281136
static void
@@ -1337,7 +1345,7 @@ update_global_state_for_extension(PyThreadState *tstate,
13371345
PyModuleDef *cached = _extensions_cache_get(path, name);
13381346
assert(cached == NULL || cached == def);
13391347
#endif
1340-
if (_extensions_cache_set(path, name, def) < 0) {
1348+
if (_extensions_cache_set(path, name, def, false) < 0) {
13411349
return -1;
13421350
}
13431351
}

0 commit comments

Comments
 (0)
0