mirror of
https://github.com/python/cpython.git
synced 2025-07-15 23:35:23 +00:00
gh-125900: Clean-up logic around immortalization in free-threading (#125901)
* Remove `@suppress_immortalization` decorator * Make suppression flag per-thread instead of per-interpreter * Suppress immortalization in `eval()` to avoid refleaks in three tests (test_datetime.test_roundtrip, test_logging.test_config8_ok, and test_random.test_after_fork). * frozenset() is constant, but not a singleton. When run multiple times, the test could fail due to constant interning.
This commit is contained in:
parent
1306f33c84
commit
332356b880
23 changed files with 36 additions and 137 deletions
|
@ -867,18 +867,17 @@ builtin_compile_impl(PyObject *module, PyObject *source, PyObject *filename,
|
|||
goto error;
|
||||
|
||||
#ifdef Py_GIL_DISABLED
|
||||
// gh-118527: Disable immortalization of code constants for explicit
|
||||
// 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();
|
||||
_Py_atomic_add_int(&interp->gc.immortalize, -2);
|
||||
_PyThreadStateImpl *tstate = (_PyThreadStateImpl *)_PyThreadState_GET();
|
||||
tstate->suppress_co_const_immortalization++;
|
||||
#endif
|
||||
|
||||
result = Py_CompileStringObject(str, filename, start[compile_mode], &cf, optimize);
|
||||
|
||||
#ifdef Py_GIL_DISABLED
|
||||
_Py_atomic_add_int(&interp->gc.immortalize, 2);
|
||||
tstate->suppress_co_const_immortalization--;
|
||||
#endif
|
||||
|
||||
Py_XDECREF(source_copy);
|
||||
|
@ -1024,7 +1023,16 @@ builtin_eval_impl(PyObject *module, PyObject *source, PyObject *globals,
|
|||
str++;
|
||||
|
||||
(void)PyEval_MergeCompilerFlags(&cf);
|
||||
#ifdef Py_GIL_DISABLED
|
||||
// Don't immortalize code constants for explicit eval() calls
|
||||
// to avoid memory leaks.
|
||||
_PyThreadStateImpl *tstate = (_PyThreadStateImpl *)_PyThreadState_GET();
|
||||
tstate->suppress_co_const_immortalization++;
|
||||
#endif
|
||||
result = PyRun_StringFlags(str, Py_eval_input, globals, locals, &cf);
|
||||
#ifdef Py_GIL_DISABLED
|
||||
tstate->suppress_co_const_immortalization--;
|
||||
#endif
|
||||
Py_XDECREF(source_copy);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue