Skip to content

Commit ed99e28

Browse files
gh-132213: use relaxed atomics for set hash (#132215)
1 parent fd1b98d commit ed99e28

File tree

1 file changed

+9
-7
lines changed

1 file changed

+9
-7
lines changed

Objects/setobject.c

+9-7
Original file line numberDiff line numberDiff line change
@@ -417,7 +417,7 @@ set_empty_to_minsize(PySetObject *so)
417417
FT_ATOMIC_STORE_SSIZE_RELAXED(so->used, 0);
418418
so->mask = PySet_MINSIZE - 1;
419419
so->table = so->smalltable;
420-
so->hash = -1;
420+
FT_ATOMIC_STORE_SSIZE_RELAXED(so->hash, -1);
421421
}
422422

423423
static int
@@ -1243,10 +1243,12 @@ set_swap_bodies(PySetObject *a, PySetObject *b)
12431243

12441244
if (PyType_IsSubtype(Py_TYPE(a), &PyFrozenSet_Type) &&
12451245
PyType_IsSubtype(Py_TYPE(b), &PyFrozenSet_Type)) {
1246-
h = a->hash; a->hash = b->hash; b->hash = h;
1246+
h = FT_ATOMIC_LOAD_SSIZE_RELAXED(a->hash);
1247+
FT_ATOMIC_STORE_SSIZE_RELAXED(a->hash, FT_ATOMIC_LOAD_SSIZE_RELAXED(b->hash));
1248+
FT_ATOMIC_STORE_SSIZE_RELAXED(b->hash, h);
12471249
} else {
1248-
a->hash = -1;
1249-
b->hash = -1;
1250+
FT_ATOMIC_STORE_SSIZE_RELAXED(a->hash, -1);
1251+
FT_ATOMIC_STORE_SSIZE_RELAXED(b->hash, -1);
12501252
}
12511253
}
12521254

@@ -2141,9 +2143,9 @@ set_richcompare(PyObject *self, PyObject *w, int op)
21412143
case Py_EQ:
21422144
if (PySet_GET_SIZE(v) != PySet_GET_SIZE(w))
21432145
Py_RETURN_FALSE;
2144-
if (v->hash != -1 &&
2145-
((PySetObject *)w)->hash != -1 &&
2146-
v->hash != ((PySetObject *)w)->hash)
2146+
Py_hash_t v_hash = FT_ATOMIC_LOAD_SSIZE_RELAXED(v->hash);
2147+
Py_hash_t w_hash = FT_ATOMIC_LOAD_SSIZE_RELAXED(((PySetObject *)w)->hash);
2148+
if (v_hash != -1 && w_hash != -1 && v_hash != w_hash)
21472149
Py_RETURN_FALSE;
21482150
return set_issubset((PyObject*)v, w);
21492151
case Py_NE:

0 commit comments

Comments
 (0)