gh-131988: Fix a multithreaded scaling regression
The 3.13 free threaded build immortalizes certain objects to avoid
reference count contention. In gh-127114 the condition was
unintentionally changed to happen when the first thread was created
instead of the first non-main thread. The `interp->gc.immortalize` field
is then cleared again during `_PyGC_Init()`.
Change the condition so that we check if we should immortalize objects
using deferred reference counting whenever a non-main thread is created.
--- /dev/null
+Fix a performance regression that caused scaling bottlenecks in the free
+threaded build in 3.13.1 and 3.13.2.
HEAD_UNLOCK(interp->runtime);
#ifdef Py_GIL_DISABLED
- if (id == 1) {
+ if (id > 1) {
if (_Py_atomic_load_int(&interp->gc.immortalize) == 0) {
// Immortalize objects marked as using deferred reference counting
- // the first time a non-main thread is created.
+ // once a non-main thread is created, if we haven't already done so.
_PyGC_ImmortalizeDeferredObjects(interp);
}
}