diff options
author | Sam Gross <colesbury@gmail.com> | 2024-06-04 13:42:13 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-06-04 13:42:13 (GMT) |
commit | e69d068ad0bd6a25434ea476a647b635da4d82bb (patch) | |
tree | 516b36fa60e740c6ffb7a38bcc73b423783477c3 /Python/pystate.c | |
parent | bd8c1f97e1709b5e8b07c31b1bc7b73acc76169d (diff) | |
download | cpython-e69d068ad0bd6a25434ea476a647b635da4d82bb.zip cpython-e69d068ad0bd6a25434ea476a647b635da4d82bb.tar.gz cpython-e69d068ad0bd6a25434ea476a647b635da4d82bb.tar.bz2 |
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`.
Diffstat (limited to 'Python/pystate.c')
-rw-r--r-- | Python/pystate.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/Python/pystate.c b/Python/pystate.c index d029391..e1a9590 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -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 } |