mirror of
https://github.com/python/cpython.git
synced 2025-08-23 10:16:01 +00:00
[3.13] gh-117657: Fix race involving immortalizing objects (GH-119927) (#120005)
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.
(cherry picked from commit 47fb4327b5
)
This commit is contained in:
parent
ca37034baa
commit
ae705319fc
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