@@ -1192,7 +1192,8 @@ _Py_dict_lookup(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject **valu
11921192 PyDictKeysObject * dk ;
11931193 DictKeysKind kind ;
11941194 Py_ssize_t ix ;
1195- // TODO: Thread safety
1195+
1196+ _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED (mp );
11961197start :
11971198 dk = mp -> ma_keys ;
11981199 kind = dk -> dk_kind ;
@@ -1390,7 +1391,7 @@ dictkeys_generic_lookup_threadsafe(PyDictObject *mp, PyDictKeysObject* dk, PyObj
13901391 return do_lookup (mp , dk , key , hash , compare_generic_threadsafe );
13911392}
13921393
1393- static Py_ssize_t
1394+ Py_ssize_t
13941395_Py_dict_lookup_threadsafe (PyDictObject * mp , PyObject * key , Py_hash_t hash , PyObject * * value_addr )
13951396{
13961397 PyDictKeysObject * dk ;
@@ -2343,11 +2344,12 @@ _PyDict_GetItemStringWithError(PyObject *v, const char *key)
23432344 * Raise an exception and return NULL if an error occurred (ex: computing the
23442345 * key hash failed, key comparison failed, ...). Return NULL if the key doesn't
23452346 * exist. Return the value if the key exists.
2347+ *
2348+ * Returns a new reference.
23462349 */
23472350PyObject *
23482351_PyDict_LoadGlobal (PyDictObject * globals , PyDictObject * builtins , PyObject * key )
23492352{
2350- // TODO: Thread safety
23512353 Py_ssize_t ix ;
23522354 Py_hash_t hash ;
23532355 PyObject * value ;
@@ -2358,17 +2360,31 @@ _PyDict_LoadGlobal(PyDictObject *globals, PyDictObject *builtins, PyObject *key)
23582360 return NULL ;
23592361 }
23602362
2363+ #ifdef Py_GIL_DISABLED
23612364 /* namespace 1: globals */
2362- ix = _Py_dict_lookup (globals , key , hash , & value );
2365+ ix = _Py_dict_lookup_threadsafe (globals , key , hash , & value );
23632366 if (ix == DKIX_ERROR )
23642367 return NULL ;
23652368 if (ix != DKIX_EMPTY && value != NULL )
23662369 return value ;
23672370
23682371 /* namespace 2: builtins */
2369- ix = _Py_dict_lookup (builtins , key , hash , & value );
2372+ ix = _Py_dict_lookup_threadsafe (builtins , key , hash , & value );
23702373 assert (ix >= 0 || value == NULL );
23712374 return value ;
2375+ #else
2376+ /* namespace 1: globals */
2377+ ix = _Py_dict_lookup (globals , key , hash , & value );
2378+ if (ix == DKIX_ERROR )
2379+ return NULL ;
2380+ if (ix != DKIX_EMPTY && value != NULL )
2381+ return Py_NewRef (value );
2382+
2383+ /* namespace 2: builtins */
2384+ ix = _Py_dict_lookup (builtins , key , hash , & value );
2385+ assert (ix >= 0 || value == NULL );
2386+ return Py_XNewRef (value );
2387+ #endif
23722388}
23732389
23742390/* Consumes references to key and value */
0 commit comments