https://github.com/python/cpython/commit/c62144a02cfae412a9deb4059fae141693a6edc9
commit: c62144a02cfae412a9deb4059fae141693a6edc9
branch: main
author: mpage <[email protected]>
committer: colesbury <[email protected]>
date: 2024-03-06T15:46:36-05:00
summary:

gh-114271: Make `_thread.lock` thread-safe in free-threaded builds (#116433)

Previously, the `locked` field was set after releasing the lock. This reverses
the order so that the `locked` field is set while the lock is still held.

There is still one thread-safety issue where `locked` is checked prior to
releasing the lock, however, in practice that will only be an issue when
unlocking the lock is contended, which should be rare.

files:
M Modules/_threadmodule.c

diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c
index 3a8f77d6dfbbc6..7587ac00eef60c 100644
--- a/Modules/_threadmodule.c
+++ b/Modules/_threadmodule.c
@@ -390,8 +390,8 @@ lock_PyThread_release_lock(lockobject *self, PyObject 
*Py_UNUSED(ignored))
         return NULL;
     }
 
-    PyThread_release_lock(self->lock_lock);
     self->locked = 0;
+    PyThread_release_lock(self->lock_lock);
     Py_RETURN_NONE;
 }
 
@@ -1665,8 +1665,8 @@ release_sentinel(void *weakref_raw)
     lockobject *lock = (lockobject *)_PyWeakref_GET_REF(weakref);
     if (lock != NULL) {
         if (lock->locked) {
-            PyThread_release_lock(lock->lock_lock);
             lock->locked = 0;
+            PyThread_release_lock(lock->lock_lock);
         }
         Py_DECREF(lock);
     }

_______________________________________________
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