@@ -1097,10 +1097,11 @@ compare_unicode_unicode(PyDictObject *mp, PyDictKeysObject *dk,
1097
1097
void * ep0 , Py_ssize_t ix , PyObject * key , Py_hash_t hash )
1098
1098
{
1099
1099
PyDictUnicodeEntry * ep = & ((PyDictUnicodeEntry * )ep0 )[ix ];
1100
- assert (ep -> me_key != NULL );
1101
- assert (PyUnicode_CheckExact (ep -> me_key ));
1102
- if (ep -> me_key == key ||
1103
- (unicode_get_hash (ep -> me_key ) == hash && unicode_eq (ep -> me_key , key ))) {
1100
+ PyObject * ep_key = FT_ATOMIC_LOAD_PTR_RELAXED (ep -> me_key );
1101
+ assert (ep_key != NULL );
1102
+ assert (PyUnicode_CheckExact (ep_key ));
1103
+ if (ep_key == key ||
1104
+ (unicode_get_hash (ep_key ) == hash && unicode_eq (ep_key , key ))) {
1104
1105
return 1 ;
1105
1106
}
1106
1107
return 0 ;
@@ -1761,10 +1762,12 @@ insertdict(PyInterpreterState *interp, PyDictObject *mp,
1761
1762
else {
1762
1763
assert (old_value != NULL );
1763
1764
if (DK_IS_UNICODE (mp -> ma_keys )) {
1764
- DK_UNICODE_ENTRIES (mp -> ma_keys )[ix ].me_value = value ;
1765
+ PyDictUnicodeEntry * ep = & DK_UNICODE_ENTRIES (mp -> ma_keys )[ix ];
1766
+ STORE_VALUE (ep , value );
1765
1767
}
1766
1768
else {
1767
- DK_ENTRIES (mp -> ma_keys )[ix ].me_value = value ;
1769
+ PyDictKeyEntry * ep = & DK_ENTRIES (mp -> ma_keys )[ix ];
1770
+ STORE_VALUE (ep , value );
1768
1771
}
1769
1772
}
1770
1773
mp -> ma_version_tag = new_version ;
@@ -1810,15 +1813,15 @@ insert_to_emptydict(PyInterpreterState *interp, PyDictObject *mp,
1810
1813
if (unicode ) {
1811
1814
PyDictUnicodeEntry * ep = DK_UNICODE_ENTRIES (newkeys );
1812
1815
ep -> me_key = key ;
1813
- ep -> me_value = value ;
1816
+ STORE_VALUE ( ep , value ) ;
1814
1817
}
1815
1818
else {
1816
1819
PyDictKeyEntry * ep = DK_ENTRIES (newkeys );
1817
1820
ep -> me_key = key ;
1818
1821
ep -> me_hash = hash ;
1819
- ep -> me_value = value ;
1822
+ STORE_VALUE ( ep , value ) ;
1820
1823
}
1821
- mp -> ma_used ++ ;
1824
+ FT_ATOMIC_STORE_SSIZE_RELAXED ( mp -> ma_used , FT_ATOMIC_LOAD_SSIZE_RELAXED ( mp -> ma_used ) + 1 ) ;
1822
1825
mp -> ma_version_tag = new_version ;
1823
1826
newkeys -> dk_usable -- ;
1824
1827
newkeys -> dk_nentries ++ ;
@@ -2510,7 +2513,7 @@ delitem_common(PyDictObject *mp, Py_hash_t hash, Py_ssize_t ix,
2510
2513
Py_ssize_t hashpos = lookdict_index (mp -> ma_keys , hash , ix );
2511
2514
assert (hashpos >= 0 );
2512
2515
2513
- mp -> ma_used -- ;
2516
+ FT_ATOMIC_STORE_SSIZE_RELAXED ( mp -> ma_used , FT_ATOMIC_LOAD_SSIZE ( mp -> ma_used ) - 1 ) ;
2514
2517
mp -> ma_version_tag = new_version ;
2515
2518
if (_PyDict_HasSplitTable (mp )) {
2516
2519
assert (old_value == mp -> ma_values -> values [ix ]);
@@ -6895,7 +6898,7 @@ _PyObject_TryGetInstanceAttribute(PyObject *obj, PyObject *name, PyObject **attr
6895
6898
}
6896
6899
6897
6900
#ifdef Py_GIL_DISABLED
6898
- PyObject * value = _Py_atomic_load_ptr_relaxed (& values -> values [ix ]);
6901
+ PyObject * value = _Py_atomic_load_ptr_acquire (& values -> values [ix ]);
6899
6902
if (value == NULL || _Py_TryIncrefCompare (& values -> values [ix ], value )) {
6900
6903
* attr = value ;
6901
6904
return true;
0 commit comments