https://github.com/python/cpython/commit/55ab33699c38c623a69b374f83566edd7410cbc3
commit: 55ab33699c38c623a69b374f83566edd7410cbc3
branch: 3.15
author: Miss Islington (bot) <[email protected]>
committer: hugovk <[email protected]>
date: 2026-09-30T13:17:02+03:00
summary:

[3.15] gh-157914: Revert "gh-135871: Reload lock internal state while spinning 
in `PyMutex_LockTimed` (gh-146064)" (gh-158082) (#158290)

Co-authored-by: Daniele Parmeggiani <[email protected]>

files:
A 
Misc/NEWS.d/next/Core_and_Builtins/2026-09-24-17-30-48.gh-issue-157914.5fVJob.rst
M Python/lock.c

diff --git 
a/Misc/NEWS.d/next/Core_and_Builtins/2026-09-24-17-30-48.gh-issue-157914.5fVJob.rst
 
b/Misc/NEWS.d/next/Core_and_Builtins/2026-09-24-17-30-48.gh-issue-157914.5fVJob.rst
new file mode 100644
index 00000000000000..b381a568cf14ac
--- /dev/null
+++ 
b/Misc/NEWS.d/next/Core_and_Builtins/2026-09-24-17-30-48.gh-issue-157914.5fVJob.rst
@@ -0,0 +1,2 @@
+Revert :gh:`146064`. The linked PyMutex change was
+causing a significant performance regression in some cases.
diff --git a/Python/lock.c b/Python/lock.c
index af136fefd299d3..84f18a0c15a769 100644
--- a/Python/lock.c
+++ b/Python/lock.c
@@ -27,10 +27,8 @@ static const PyTime_t TIME_TO_BE_FAIR_NS = 1000*1000;
 // enabled.
 #if Py_GIL_DISABLED
 static const int MAX_SPIN_COUNT = 40;
-static const int RELOAD_SPIN_MASK = 3;
 #else
 static const int MAX_SPIN_COUNT = 0;
-static const int RELOAD_SPIN_MASK = 1;
 #endif
 
 struct mutex_entry {
@@ -81,16 +79,6 @@ _PyMutex_LockTimed(PyMutex *m, PyTime_t timeout, 
_PyLockFlags flags)
     };
 
     Py_ssize_t spin_count = 0;
-#ifdef Py_GIL_DISABLED
-    // Using thread-id as a way of reducing contention further in the reload 
below.
-    // It adds a pseudo-random starting offset to the recurrence, so that 
threads
-    // are less likely to try and run compare-exchange at the same time.
-    // The lower bits of platform thread ids are likely to not be random,
-    // hence the right shift.
-    const Py_ssize_t tid = (Py_ssize_t)(_Py_ThreadId() >> 12);
-#else
-    const Py_ssize_t tid = 0;
-#endif
     for (;;) {
         if ((v & _Py_LOCKED) == 0) {
             // The lock is unlocked. Try to grab it.
@@ -104,9 +92,6 @@ _PyMutex_LockTimed(PyMutex *m, PyTime_t timeout, 
_PyLockFlags flags)
             // Spin for a bit.
             _Py_yield();
             spin_count++;
-            if (((spin_count + tid) & RELOAD_SPIN_MASK) == 0) {
-                v = _Py_atomic_load_uint8_relaxed(&m->_bits);
-            }
             continue;
         }
 

_______________________________________________
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]

Reply via email to