@@ -413,8 +413,11 @@ remove_module(PyThreadState *tstate, PyObject *name)
413
413
Py_ssize_t
414
414
_PyImport_GetNextModuleIndex (void )
415
415
{
416
+ PyThread_acquire_lock (EXTENSIONS .mutex , WAIT_LOCK );
416
417
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 ;
418
421
}
419
422
420
423
static const char *
@@ -703,21 +706,25 @@ _PyImport_ClearModulesByIndex(PyInterpreterState *interp)
703
706
const char *
704
707
_PyImport_ResolveNameWithPackageContext (const char * name )
705
708
{
709
+ PyThread_acquire_lock (EXTENSIONS .mutex , WAIT_LOCK );
706
710
if (PKGCONTEXT != NULL ) {
707
711
const char * p = strrchr (PKGCONTEXT , '.' );
708
712
if (p != NULL && strcmp (name , p + 1 ) == 0 ) {
709
713
name = PKGCONTEXT ;
710
714
PKGCONTEXT = NULL ;
711
715
}
712
716
}
717
+ PyThread_release_lock (EXTENSIONS .mutex );
713
718
return name ;
714
719
}
715
720
716
721
const char *
717
722
_PyImport_SwapPackageContext (const char * newcontext )
718
723
{
724
+ PyThread_acquire_lock (EXTENSIONS .mutex , WAIT_LOCK );
719
725
const char * oldcontext = PKGCONTEXT ;
720
726
PKGCONTEXT = newcontext ;
727
+ PyThread_release_lock (EXTENSIONS .mutex );
721
728
return oldcontext ;
722
729
}
723
730
@@ -865,13 +872,13 @@ gets even messier.
865
872
static inline void
866
873
extensions_lock_acquire (void )
867
874
{
868
- // XXX For now the GIL is sufficient.
875
+ PyThread_acquire_lock ( _PyRuntime . imports . extensions . mutex , WAIT_LOCK );
869
876
}
870
877
871
878
static inline void
872
879
extensions_lock_release (void )
873
880
{
874
- // XXX For now the GIL is sufficient.
881
+ PyThread_release_lock ( _PyRuntime . imports . extensions . mutex );
875
882
}
876
883
877
884
/* Magic for extension modules (built-in as well as dynamically
0 commit comments