@@ -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
423423static 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