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.
return NULL;
}
- PyThread_release_lock(self->lock_lock);
self->locked = 0;
+ PyThread_release_lock(self->lock_lock);
Py_RETURN_NONE;
}
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);
}