aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2024-06-03 05:45:44 +0200
committerGitHub <noreply@github.com>2024-06-03 03:45:44 +0000
commite5dfcea3e32f02cc740d7cb96f36f8327f3650bd (patch)
tree1e90432ee00820757f265345ddd05d4fbe81cbcf
parent[3.13] gh-109975: What's New in Python 3.13: fix broken link for `telnetlib` ... (diff)
downloadcpython-e5dfcea3e32f02cc740d7cb96f36f8327f3650bd.tar.gz
cpython-e5dfcea3e32f02cc740d7cb96f36f8327f3650bd.tar.bz2
cpython-e5dfcea3e32f02cc740d7cb96f36f8327f3650bd.zip
[3.13] gh-117657: Fix data races report by TSAN unicode-hash (gh-119907) (gh-119963)
gh-117657: Fix data races report by TSAN unicode-hash (gh-119907) (cherry picked from commit 0594a27e5f1d87d59fa8a761dd8ca9df4e42816d) Co-authored-by: Donghee Na <donghee.na@python.org>
-rw-r--r--Objects/unicodeobject.c19
-rw-r--r--Tools/tsan/suppressions_free_threading.txt1
2 files changed, 11 insertions, 9 deletions
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c
index c8a07288d39..240f4e76e2a 100644
--- a/Objects/unicodeobject.c
+++ b/Objects/unicodeobject.c
@@ -1625,7 +1625,7 @@ unicode_modifiable(PyObject *unicode)
assert(_PyUnicode_CHECK(unicode));
if (Py_REFCNT(unicode) != 1)
return 0;
- if (_PyUnicode_HASH(unicode) != -1)
+ if (FT_ATOMIC_LOAD_SSIZE_RELAXED(_PyUnicode_HASH(unicode)) != -1)
return 0;
if (PyUnicode_CHECK_INTERNED(unicode))
return 0;
@@ -10819,9 +10819,10 @@ _PyUnicode_EqualToASCIIId(PyObject *left, _Py_Identifier *right)
if (PyUnicode_CHECK_INTERNED(left))
return 0;
- assert(_PyUnicode_HASH(right_uni) != -1);
- Py_hash_t hash = _PyUnicode_HASH(left);
- if (hash != -1 && hash != _PyUnicode_HASH(right_uni)) {
+ Py_hash_t right_hash = FT_ATOMIC_LOAD_SSIZE_RELAXED(_PyUnicode_HASH(right_uni));
+ assert(right_hash != -1);
+ Py_hash_t hash = FT_ATOMIC_LOAD_SSIZE_RELAXED(_PyUnicode_HASH(left));
+ if (hash != -1 && hash != right_hash) {
return 0;
}
@@ -11306,12 +11307,14 @@ unicode_hash(PyObject *self)
#ifdef Py_DEBUG
assert(_Py_HashSecret_Initialized);
#endif
- if (_PyUnicode_HASH(self) != -1)
- return _PyUnicode_HASH(self);
-
+ Py_hash_t hash = FT_ATOMIC_LOAD_SSIZE_RELAXED(_PyUnicode_HASH(self));
+ if (hash != -1) {
+ return hash;
+ }
x = _Py_HashBytes(PyUnicode_DATA(self),
PyUnicode_GET_LENGTH(self) * PyUnicode_KIND(self));
- _PyUnicode_HASH(self) = x;
+
+ FT_ATOMIC_STORE_SSIZE_RELAXED(_PyUnicode_HASH(self), x);
return x;
}
diff --git a/Tools/tsan/suppressions_free_threading.txt b/Tools/tsan/suppressions_free_threading.txt
index a451c9dd6be..60839e636a6 100644
--- a/Tools/tsan/suppressions_free_threading.txt
+++ b/Tools/tsan/suppressions_free_threading.txt
@@ -49,7 +49,6 @@ race_top:set_discard_entry
race_top:set_inheritable
race_top:start_the_world
race_top:tstate_set_detached
-race_top:unicode_hash
race_top:Py_SET_TYPE
race_top:_PyDict_CheckConsistency
race_top:_PyImport_AcquireLock