gh-112062: Make _struct module thread-safe in --disable-gil builds (#112094)

* gh-112062: Make `_struct` module thread-safe in --disable-gil builds
This commit is contained in:
Radislav Chugunov 2023-11-15 07:00:34 +03:00 committed by GitHub
parent 55f3cce821
commit 4744f59a5e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -2250,12 +2250,6 @@ cache_struct_converter(PyObject *module, PyObject *fmt, PyStructObject **ptr)
return 1; return 1;
} }
if (state->cache == NULL) {
state->cache = PyDict_New();
if (state->cache == NULL)
return 0;
}
s_object = PyDict_GetItemWithError(state->cache, fmt); s_object = PyDict_GetItemWithError(state->cache, fmt);
if (s_object != NULL) { if (s_object != NULL) {
*ptr = (PyStructObject *)Py_NewRef(s_object); *ptr = (PyStructObject *)Py_NewRef(s_object);
@ -2288,7 +2282,7 @@ static PyObject *
_clearcache_impl(PyObject *module) _clearcache_impl(PyObject *module)
/*[clinic end generated code: output=ce4fb8a7bf7cb523 input=463eaae04bab3211]*/ /*[clinic end generated code: output=ce4fb8a7bf7cb523 input=463eaae04bab3211]*/
{ {
Py_CLEAR(get_struct_state(module)->cache); PyDict_Clear(get_struct_state(module)->cache);
Py_RETURN_NONE; Py_RETURN_NONE;
} }
@ -2512,6 +2506,11 @@ _structmodule_exec(PyObject *m)
{ {
_structmodulestate *state = get_struct_state(m); _structmodulestate *state = get_struct_state(m);
state->cache = PyDict_New();
if (state->cache == NULL) {
return -1;
}
state->PyStructType = PyType_FromModuleAndSpec( state->PyStructType = PyType_FromModuleAndSpec(
m, &PyStructType_spec, NULL); m, &PyStructType_spec, NULL);
if (state->PyStructType == NULL) { if (state->PyStructType == NULL) {