Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 062c66c

Browse filesBrowse files
Factor out _extensions_cache_find_unlocked().
1 parent 77ff3a6 commit 062c66c
Copy full SHA for 062c66c

File tree

Expand file treeCollapse file tree

1 file changed

+52
-44
lines changed
Filter options
Expand file treeCollapse file tree

1 file changed

+52
-44
lines changed

‎Python/import.c

Copy file name to clipboardExpand all lines: Python/import.c
+52-44Lines 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 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)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.