diff options
| author | Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> | 2024-06-04 14:08:10 (GMT) |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-06-04 14:08:10 (GMT) |
| commit | ee7d2681f6e2ece539bc70d21893353da84401fd (patch) | |
| tree | 5b98fcd4c861ee81204711e2a679746b6cf5a507 /Python/gc_free_threading.c | |
| parent | 720a44d414b68943c766716145d7c6d15ea213de (diff) | |
| download | cpython-ee7d2681f6e2ece539bc70d21893353da84401fd.zip cpython-ee7d2681f6e2ece539bc70d21893353da84401fd.tar.gz cpython-ee7d2681f6e2ece539bc70d21893353da84401fd.tar.bz2 | |
[3.13] gh-117657: Fix race involving GC and heap initialization (GH-119923) (#120038)
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`.
(cherry picked from commit e69d068ad0bd6a25434ea476a647b635da4d82bb)
Co-authored-by: Sam Gross <colesbury@gmail.com>
Diffstat (limited to 'Python/gc_free_threading.c')
| -rw-r--r-- | Python/gc_free_threading.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/Python/gc_free_threading.c b/Python/gc_free_threading.c index d005b79..f19362c 100644 --- a/Python/gc_free_threading.c +++ b/Python/gc_free_threading.c @@ -252,6 +252,10 @@ gc_visit_heaps_lock_held(PyInterpreterState *interp, mi_block_visit_fun *visitor // visit each thread's heaps for GC objects for (PyThreadState *p = interp->threads.head; p != NULL; p = p->next) { struct _mimalloc_thread_state *m = &((_PyThreadStateImpl *)p)->mimalloc; + if (!_Py_atomic_load_int(&m->initialized)) { + // The thread may not have called tstate_mimalloc_bind() yet. + continue; + } arg->offset = offset_base; if (!mi_heap_visit_blocks(&m->heaps[_Py_MIMALLOC_HEAP_GC], true, |
