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]