gh-117657: Fix data races report by TSAN unicode-hash (gh-119907)

This commit is contained in:
Donghee Na 2024-06-03 12:22:41 +09:00 committed by GitHub
parent 117a8acdab
commit 0594a27e5f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 11 additions and 9 deletions

View File

@ -1633,7 +1633,7 @@ unicode_modifiable(PyObject *unicode)
assert(_PyUnicode_CHECK(unicode)); assert(_PyUnicode_CHECK(unicode));
if (Py_REFCNT(unicode) != 1) if (Py_REFCNT(unicode) != 1)
return 0; return 0;
if (_PyUnicode_HASH(unicode) != -1) if (FT_ATOMIC_LOAD_SSIZE_RELAXED(_PyUnicode_HASH(unicode)) != -1)
return 0; return 0;
if (PyUnicode_CHECK_INTERNED(unicode)) if (PyUnicode_CHECK_INTERNED(unicode))
return 0; return 0;
@ -10901,9 +10901,10 @@ _PyUnicode_EqualToASCIIId(PyObject *left, _Py_Identifier *right)
if (PyUnicode_CHECK_INTERNED(left)) if (PyUnicode_CHECK_INTERNED(left))
return 0; return 0;
assert(_PyUnicode_HASH(right_uni) != -1); Py_hash_t right_hash = FT_ATOMIC_LOAD_SSIZE_RELAXED(_PyUnicode_HASH(right_uni));
Py_hash_t hash = _PyUnicode_HASH(left); assert(right_hash != -1);
if (hash != -1 && hash != _PyUnicode_HASH(right_uni)) { Py_hash_t hash = FT_ATOMIC_LOAD_SSIZE_RELAXED(_PyUnicode_HASH(left));
if (hash != -1 && hash != right_hash) {
return 0; return 0;
} }
@ -11388,12 +11389,14 @@ unicode_hash(PyObject *self)
#ifdef Py_DEBUG #ifdef Py_DEBUG
assert(_Py_HashSecret_Initialized); assert(_Py_HashSecret_Initialized);
#endif #endif
if (_PyUnicode_HASH(self) != -1) Py_hash_t hash = FT_ATOMIC_LOAD_SSIZE_RELAXED(_PyUnicode_HASH(self));
return _PyUnicode_HASH(self); if (hash != -1) {
return hash;
}
x = _Py_HashBytes(PyUnicode_DATA(self), x = _Py_HashBytes(PyUnicode_DATA(self),
PyUnicode_GET_LENGTH(self) * PyUnicode_KIND(self)); PyUnicode_GET_LENGTH(self) * PyUnicode_KIND(self));
_PyUnicode_HASH(self) = x;
FT_ATOMIC_STORE_SSIZE_RELAXED(_PyUnicode_HASH(self), x);
return x; return x;
} }

View File

@ -49,7 +49,6 @@ race_top:set_discard_entry
race_top:set_inheritable race_top:set_inheritable
race_top:start_the_world race_top:start_the_world
race_top:tstate_set_detached race_top:tstate_set_detached
race_top:unicode_hash
race_top:Py_SET_TYPE race_top:Py_SET_TYPE
race_top:_PyDict_CheckConsistency race_top:_PyDict_CheckConsistency
race_top:_PyImport_AcquireLock race_top:_PyImport_AcquireLock