@@ -417,7 +417,7 @@ set_empty_to_minsize(PySetObject *so)
417
417
FT_ATOMIC_STORE_SSIZE_RELAXED (so -> used , 0 );
418
418
so -> mask = PySet_MINSIZE - 1 ;
419
419
so -> table = so -> smalltable ;
420
- so -> hash = -1 ;
420
+ FT_ATOMIC_STORE_SSIZE_RELAXED ( so -> hash , -1 ) ;
421
421
}
422
422
423
423
static int
@@ -1243,10 +1243,12 @@ set_swap_bodies(PySetObject *a, PySetObject *b)
1243
1243
1244
1244
if (PyType_IsSubtype (Py_TYPE (a ), & PyFrozenSet_Type ) &&
1245
1245
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 );
1247
1249
} 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 ) ;
1250
1252
}
1251
1253
}
1252
1254
@@ -2141,9 +2143,9 @@ set_richcompare(PyObject *self, PyObject *w, int op)
2141
2143
case Py_EQ :
2142
2144
if (PySet_GET_SIZE (v ) != PySet_GET_SIZE (w ))
2143
2145
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 )
2147
2149
Py_RETURN_FALSE ;
2148
2150
return set_issubset ((PyObject * )v , w );
2149
2151
case Py_NE :
0 commit comments