mirror of
https://github.com/python/cpython.git
synced 2026-06-08 02:41:11 +00:00
In free-threaded builds, concurrent calls to PyDict_AddWatcher, PyDict_ClearWatcher, PyDict_Watch, and PyDict_Unwatch can race on the shared callback array and the per-dict watcher tags. This change adds a mutex to serialize watcher registration and removal, atomic operations for tag updates, and atomic acquire/release synchronization for callback dispatch in _PyDict_SendEvent.
30 lines
677 B
C
30 lines
677 B
C
#ifndef Py_INTERNAL_DICT_STATE_H
|
|
#define Py_INTERNAL_DICT_STATE_H
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#ifndef Py_BUILD_CORE
|
|
# error "this header requires Py_BUILD_CORE define"
|
|
#endif
|
|
|
|
#define DICT_MAX_WATCHERS 8
|
|
#define DICT_WATCHED_MUTATION_BITS 4
|
|
|
|
struct _Py_dict_state {
|
|
uint32_t next_keys_version;
|
|
PyMutex watcher_mutex; // Protects the watchers array (free-threaded builds)
|
|
_PyOnceFlag watcher_setup_once; // One-time optimizer watcher setup
|
|
PyDict_WatchCallback watchers[DICT_MAX_WATCHERS];
|
|
};
|
|
|
|
#define _dict_state_INIT \
|
|
{ \
|
|
.next_keys_version = 2, \
|
|
}
|
|
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
#endif /* !Py_INTERNAL_DICT_STATE_H */
|