summaryrefslogtreecommitdiffstats
path: root/Python/pystate.c
diff options
context:
space:
mode:
authorSam Gross <colesbury@gmail.com>2024-04-29 18:36:02 (GMT)
committerGitHub <noreply@github.com>2024-04-29 18:36:02 (GMT)
commit7ccacb220d99662b626c8bc63b00a27eaf604f0c (patch)
tree231cb901ee62e523be237392b0f2b966aa8be128 /Python/pystate.c
parent8d4b756fd31d4d91b55105b1241561e92cc571a3 (diff)
downloadcpython-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 'Python/pystate.c')
-rw-r--r--Python/pystate.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/Python/pystate.c b/Python/pystate.c
index bca28ce..78b39c9 100644
--- a/Python/pystate.c
+++ b/Python/pystate.c
@@ -1568,6 +1568,17 @@ new_threadstate(PyInterpreterState *interp, int whence)
// Must be called with lock unlocked to avoid re-entrancy deadlock.
PyMem_RawFree(new_tstate);
}
+ else {
+#ifdef Py_GIL_DISABLED
+ if (interp->gc.immortalize.enable_on_thread_created &&
+ !interp->gc.immortalize.enabled)
+ {
+ // Immortalize objects marked as using deferred reference counting
+ // the first time a non-main thread is created.
+ _PyGC_ImmortalizeDeferredObjects(interp);
+ }
+#endif
+ }
#ifdef Py_GIL_DISABLED
// Must be called with lock unlocked to avoid lock ordering deadlocks.