gh-152075: Avoid lock contention in _Py_Specialize_LoadGlobal under free threading (gh-153720)

colesbury <[email protected]> Thu, 30 Jul 2026 21:28:38 -0400 (EDT)
Newsgroups gmane.comp.python.cvs
Message-ID <[email protected]>
https://github.com/python/cpython/commit/ac8ba0ca5a04cd7b27b44822d31df640e817fd78
commit: ac8ba0ca5a04cd7b27b44822d31df640e817fd78
branch: main
author: Peter Hawkins <[email protected]>
committer: colesbury <[email protected]>
date: 2026-07-31T01:28:20Z
summary:

gh-152075: Avoid lock contention in _Py_Specialize_LoadGlobal under free threading (gh-153720)

Under high thread concurrency in free-threaded builds, `_Py_Specialize_LoadGlobal` suffers from lock contention when acquiring the critical section mutexes for the `globals` and `builtins` dictionaries during bytecode specialization.

This PR skips LOAD_GLOBAL bytecode specialization if acquiring the two object mutexes would block.

files:
A Misc/NEWS.d/next/Core_and_Builtins/2026-07-14-20-19-48.gh-issue-152075.V9Rwhp.rst
M Python/specialize.c

diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-07-14-20-19-48.gh-issue-152075.V9Rwhp.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-07-14-20-19-48.gh-issue-152075.V9Rwhp.rst
new file mode 100644
index 000000000000000..84c7d36b97acba0
--- /dev/null
+++ b/Misc/NEWS.d/next/Core_and_Builtins/2026-07-14-20-19-48.gh-issue-152075.V9Rwhp.rst
@@ -0,0 +1,2 @@
+Reduced lock contention during LOAD_GLOBAL bytecode specialization under
+free threading.
diff --git a/Python/specialize.c b/Python/specialize.c
index 773b55c329c7720..05cb76ff015ff40 100644
--- a/Python/specialize.c
+++ b/Python/specialize.c
@@ -1457,6 +1457,14 @@ _Py_Specialize_LoadGlobal(
     PyObject *globals, PyObject *builtins,
     _Py_CODEUNIT *instr, PyObject *name)
 {
+#ifdef Py_GIL_DISABLED
+    if (PyMutex_IsLocked(&globals->ob_mutex) || PyMutex_IsLocked(&builtins->ob_mutex)) {
+        // Skip specialization if either dictionary is locked to avoid lock
+        // contention.
+        unspecialize(instr);
+        return;
+    }
+#endif
     Py_BEGIN_CRITICAL_SECTION2(globals, builtins);
     specialize_load_global_lock_held(globals, builtins, instr, name);
     Py_END_CRITICAL_SECTION2();

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]