mirror of
https://github.com/python/cpython.git
synced 2025-11-01 22:21:35 +00:00
gh-117657: Fix race involving immortalizing objects (#119927)
The free-threaded build currently immortalizes objects that use deferred reference counting (see gh-117783). This typically happens once the first non-main thread is created, but the behavior can be suppressed for tests, in subinterpreters, or during a compile() call. This fixes a race condition involving the tracking of whether the behavior is suppressed.
This commit is contained in:
parent
b8fde5db86
commit
47fb4327b5
9 changed files with 30 additions and 44 deletions
|
|
@ -870,15 +870,15 @@ builtin_compile_impl(PyObject *module, PyObject *source, PyObject *filename,
|
|||
// gh-118527: Disable immortalization of code constants for explicit
|
||||
// compile() calls to get consistent frozen outputs between the default
|
||||
// and free-threaded builds.
|
||||
// Subtract two to suppress immortalization (so that 1 -> -1)
|
||||
PyInterpreterState *interp = _PyInterpreterState_GET();
|
||||
int old_value = interp->gc.immortalize.enable_on_thread_created;
|
||||
interp->gc.immortalize.enable_on_thread_created = 0;
|
||||
_Py_atomic_add_int(&interp->gc.immortalize, -2);
|
||||
#endif
|
||||
|
||||
result = Py_CompileStringObject(str, filename, start[compile_mode], &cf, optimize);
|
||||
|
||||
#ifdef Py_GIL_DISABLED
|
||||
interp->gc.immortalize.enable_on_thread_created = old_value;
|
||||
_Py_atomic_add_int(&interp->gc.immortalize, 2);
|
||||
#endif
|
||||
|
||||
Py_XDECREF(source_copy);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue