diff options
author | Sam Gross <colesbury@gmail.com> | 2024-04-29 18:36:02 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-04-29 18:36:02 (GMT) |
commit | 7ccacb220d99662b626c8bc63b00a27eaf604f0c (patch) | |
tree | 231cb901ee62e523be237392b0f2b966aa8be128 /Modules/_testinternalcapi.c | |
parent | 8d4b756fd31d4d91b55105b1241561e92cc571a3 (diff) | |
download | cpython-7ccacb220d99662b626c8bc63b00a27eaf604f0c.zip cpython-7ccacb220d99662b626c8bc63b00a27eaf604f0c.tar.gz cpython-7ccacb220d99662b626c8bc63b00a27eaf604f0c.tar.bz2 |
gh-117783: Immortalize objects that use deferred reference counting (#118112)
Deferred reference counting is not fully implemented yet. As a temporary
measure, we immortalize objects that would use deferred reference
counting to avoid multi-threaded scaling bottlenecks.
This is only performed in the free-threaded build once the first
non-main thread is started. Additionally, some tests, including refleak
tests, suppress this behavior.
Diffstat (limited to 'Modules/_testinternalcapi.c')
-rw-r--r-- | Modules/_testinternalcapi.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/Modules/_testinternalcapi.c b/Modules/_testinternalcapi.c index b0bba34..99e80ba 100644 --- a/Modules/_testinternalcapi.c +++ b/Modules/_testinternalcapi.c @@ -1958,6 +1958,27 @@ get_py_thread_id(PyObject *self, PyObject *Py_UNUSED(ignored)) #endif static PyObject * +set_immortalize_deferred(PyObject *self, PyObject *value) +{ +#ifdef Py_GIL_DISABLED + PyInterpreterState *interp = PyInterpreterState_Get(); + int old_enabled = interp->gc.immortalize.enabled; + int old_enabled_on_thread = interp->gc.immortalize.enable_on_thread_created; + int enabled_on_thread = 0; + if (!PyArg_ParseTuple(value, "i|i", + &interp->gc.immortalize.enabled, + &enabled_on_thread)) + { + return NULL; + } + interp->gc.immortalize.enable_on_thread_created = enabled_on_thread; + return Py_BuildValue("ii", old_enabled, old_enabled_on_thread); +#else + return Py_BuildValue("OO", Py_False, Py_False); +#endif +} + +static PyObject * has_inline_values(PyObject *self, PyObject *obj) { if ((Py_TYPE(obj)->tp_flags & Py_TPFLAGS_INLINE_VALUES) && @@ -2050,6 +2071,7 @@ static PyMethodDef module_functions[] = { #ifdef Py_GIL_DISABLED {"py_thread_id", get_py_thread_id, METH_NOARGS}, #endif + {"set_immortalize_deferred", set_immortalize_deferred, METH_VARARGS}, {"uop_symbols_test", _Py_uop_symbols_test, METH_NOARGS}, {NULL, NULL} /* sentinel */ }; |