gh-117657: Fix race involving GC and heap initialization (#119923)
The `_PyThreadState_Bind()` function is called before the first `PyEval_AcquireThread()` so it's not synchronized with the stop the world GC. We had a race where `gc_visit_heaps()` might visit a thread's heap while it's being initialized. Use a simple atomic int to avoid visiting heaps for threads that are not yet fully initialized (i.e., before `tstate_mimalloc_bind()` is called). The race was reproducible by running: `python Lib/test/test_importlib/partial/pool_in_threads.py`.
This commit is contained in:
@@ -3074,6 +3074,8 @@ tstate_mimalloc_bind(PyThreadState *tstate)
|
||||
// _PyObject_GC_New() and similar functions temporarily override this to
|
||||
// use one of the GC heaps.
|
||||
mts->current_object_heap = &mts->heaps[_Py_MIMALLOC_HEAP_OBJECT];
|
||||
|
||||
_Py_atomic_store_int(&mts->initialized, 1);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user