mirror of
https://github.com/python/cpython.git
synced 2026-04-20 10:51:00 +00:00
gh-148393: Use acquire load for _ma_watcher_tag in dict notify event (gh-148509)
The watcher-bits read in _PyDict_NotifyEvent needs to use acquire to synchronize with the release from PyDict_Watch so that the callback publication is visible before the callback is invoked.
This commit is contained in:
parent
e6893943b7
commit
19f96f99fe
2 changed files with 4 additions and 1 deletions
|
|
@ -292,7 +292,7 @@ _PyDict_NotifyEvent(PyDict_WatchEvent event,
|
|||
PyObject *value)
|
||||
{
|
||||
assert(Py_REFCNT((PyObject*)mp) > 0);
|
||||
int watcher_bits = FT_ATOMIC_LOAD_UINT64_RELAXED(mp->_ma_watcher_tag) & DICT_WATCHER_MASK;
|
||||
int watcher_bits = FT_ATOMIC_LOAD_UINT64_ACQUIRE(mp->_ma_watcher_tag) & DICT_WATCHER_MASK;
|
||||
if (watcher_bits) {
|
||||
RARE_EVENT_STAT_INC(watched_dict_modification);
|
||||
_PyDict_SendEvent(watcher_bits, event, mp, key, value);
|
||||
|
|
|
|||
|
|
@ -49,6 +49,8 @@ extern "C" {
|
|||
_Py_atomic_load_uint16_relaxed(&value)
|
||||
#define FT_ATOMIC_LOAD_UINT32_RELAXED(value) \
|
||||
_Py_atomic_load_uint32_relaxed(&value)
|
||||
#define FT_ATOMIC_LOAD_UINT64_ACQUIRE(value) \
|
||||
_Py_atomic_load_uint64_acquire(&value)
|
||||
#define FT_ATOMIC_LOAD_UINT64_RELAXED(value) \
|
||||
_Py_atomic_load_uint64_relaxed(&value)
|
||||
#define FT_ATOMIC_LOAD_ULONG_RELAXED(value) \
|
||||
|
|
@ -154,6 +156,7 @@ extern "C" {
|
|||
#define FT_ATOMIC_LOAD_UINT8_RELAXED(value) value
|
||||
#define FT_ATOMIC_LOAD_UINT16_RELAXED(value) value
|
||||
#define FT_ATOMIC_LOAD_UINT32_RELAXED(value) value
|
||||
#define FT_ATOMIC_LOAD_UINT64_ACQUIRE(value) value
|
||||
#define FT_ATOMIC_LOAD_UINT64_RELAXED(value) value
|
||||
#define FT_ATOMIC_LOAD_ULONG_RELAXED(value) value
|
||||
#define FT_ATOMIC_STORE_PTR_RELAXED(value, new_value) value = new_value
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue