mirror of https://github.com/python/cpython
gh-117657: Quiet erroneous TSAN reports of data races in `_PySeqLock` (#117955)
Quiet erroneous TSAN reports of data races in `_PySeqLock` TSAN reports a couple of data races between the compare/exchange in `_PySeqLock_LockWrite` and the non-atomic loads in `_PySeqLock_{Abandon,Unlock}Write`. This is another instance of TSAN incorrectly modeling failed compare/exchange as a write instead of a load.
This commit is contained in:
parent
b6c62c79e7
commit
0d29302155
|
@ -472,7 +472,7 @@ _PyRWMutex_Unlock(_PyRWMutex *rwmutex)
|
||||||
|
|
||||||
void _PySeqLock_LockWrite(_PySeqLock *seqlock)
|
void _PySeqLock_LockWrite(_PySeqLock *seqlock)
|
||||||
{
|
{
|
||||||
// lock the entry by setting by moving to an odd sequence number
|
// lock by moving to an odd sequence number
|
||||||
uint32_t prev = _Py_atomic_load_uint32_relaxed(&seqlock->sequence);
|
uint32_t prev = _Py_atomic_load_uint32_relaxed(&seqlock->sequence);
|
||||||
while (1) {
|
while (1) {
|
||||||
if (SEQLOCK_IS_UPDATING(prev)) {
|
if (SEQLOCK_IS_UPDATING(prev)) {
|
||||||
|
@ -492,14 +492,14 @@ void _PySeqLock_LockWrite(_PySeqLock *seqlock)
|
||||||
|
|
||||||
void _PySeqLock_AbandonWrite(_PySeqLock *seqlock)
|
void _PySeqLock_AbandonWrite(_PySeqLock *seqlock)
|
||||||
{
|
{
|
||||||
uint32_t new_seq = seqlock->sequence - 1;
|
uint32_t new_seq = _Py_atomic_load_uint32_relaxed(&seqlock->sequence) - 1;
|
||||||
assert(!SEQLOCK_IS_UPDATING(new_seq));
|
assert(!SEQLOCK_IS_UPDATING(new_seq));
|
||||||
_Py_atomic_store_uint32(&seqlock->sequence, new_seq);
|
_Py_atomic_store_uint32(&seqlock->sequence, new_seq);
|
||||||
}
|
}
|
||||||
|
|
||||||
void _PySeqLock_UnlockWrite(_PySeqLock *seqlock)
|
void _PySeqLock_UnlockWrite(_PySeqLock *seqlock)
|
||||||
{
|
{
|
||||||
uint32_t new_seq = seqlock->sequence + 1;
|
uint32_t new_seq = _Py_atomic_load_uint32_relaxed(&seqlock->sequence) + 1;
|
||||||
assert(!SEQLOCK_IS_UPDATING(new_seq));
|
assert(!SEQLOCK_IS_UPDATING(new_seq));
|
||||||
_Py_atomic_store_uint32(&seqlock->sequence, new_seq);
|
_Py_atomic_store_uint32(&seqlock->sequence, new_seq);
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,7 +26,6 @@ race:_PyObject_GC_IS_SHARED
|
||||||
race:_PyObject_GC_SET_SHARED
|
race:_PyObject_GC_SET_SHARED
|
||||||
race:_PyObject_GC_TRACK
|
race:_PyObject_GC_TRACK
|
||||||
race:_PyType_HasFeature
|
race:_PyType_HasFeature
|
||||||
race:_PyType_Lookup
|
|
||||||
race:assign_version_tag
|
race:assign_version_tag
|
||||||
race:compare_unicode_unicode
|
race:compare_unicode_unicode
|
||||||
race:delitem_common
|
race:delitem_common
|
||||||
|
@ -47,4 +46,3 @@ race:set_inheritable
|
||||||
race:start_the_world
|
race:start_the_world
|
||||||
race:tstate_set_detached
|
race:tstate_set_detached
|
||||||
race:unicode_hash
|
race:unicode_hash
|
||||||
race:update_cache_gil_disabled
|
|
||||||
|
|
Loading…
Reference in New Issue