@@ -413,8 +413,11 @@ remove_module(PyThreadState *tstate, PyObject *name)
413413Py_ssize_t
414414_PyImport_GetNextModuleIndex (void )
415415{
416+ PyThread_acquire_lock (EXTENSIONS .mutex , WAIT_LOCK );
416417 LAST_MODULE_INDEX ++ ;
417- return LAST_MODULE_INDEX ;
418+ Py_ssize_t index = LAST_MODULE_INDEX ;
419+ PyThread_release_lock (EXTENSIONS .mutex );
420+ return index ;
418421}
419422
420423static const char *
@@ -703,21 +706,25 @@ _PyImport_ClearModulesByIndex(PyInterpreterState *interp)
703706const char *
704707_PyImport_ResolveNameWithPackageContext (const char * name )
705708{
709+ PyThread_acquire_lock (EXTENSIONS .mutex , WAIT_LOCK );
706710 if (PKGCONTEXT != NULL ) {
707711 const char * p = strrchr (PKGCONTEXT , '.' );
708712 if (p != NULL && strcmp (name , p + 1 ) == 0 ) {
709713 name = PKGCONTEXT ;
710714 PKGCONTEXT = NULL ;
711715 }
712716 }
717+ PyThread_release_lock (EXTENSIONS .mutex );
713718 return name ;
714719}
715720
716721const char *
717722_PyImport_SwapPackageContext (const char * newcontext )
718723{
724+ PyThread_acquire_lock (EXTENSIONS .mutex , WAIT_LOCK );
719725 const char * oldcontext = PKGCONTEXT ;
720726 PKGCONTEXT = newcontext ;
727+ PyThread_release_lock (EXTENSIONS .mutex );
721728 return oldcontext ;
722729}
723730
@@ -865,13 +872,13 @@ gets even messier.
865872static inline void
866873extensions_lock_acquire (void )
867874{
868- // XXX For now the GIL is sufficient.
875+ PyThread_acquire_lock ( _PyRuntime . imports . extensions . mutex , WAIT_LOCK );
869876}
870877
871878static inline void
872879extensions_lock_release (void )
873880{
874- // XXX For now the GIL is sufficient.
881+ PyThread_release_lock ( _PyRuntime . imports . extensions . mutex );
875882}
876883
877884/* Magic for extension modules (built-in as well as dynamically
0 commit comments