@@ -7866,9 +7866,8 @@ PyDict_Watch(int watcher_id, PyObject* dict)
78667866 if (validate_watcher_id (interp , watcher_id )) {
78677867 return -1 ;
78687868 }
7869- Py_BEGIN_CRITICAL_SECTION (dict );
7870- ((PyDictObject * )dict )-> _ma_watcher_tag |= (1ULL << watcher_id );
7871- Py_END_CRITICAL_SECTION ();
7869+ FT_ATOMIC_OR_UINT64 (((PyDictObject * )dict )-> _ma_watcher_tag ,
7870+ 1ULL << watcher_id );
78727871 return 0 ;
78737872}
78747873
@@ -7883,9 +7882,8 @@ PyDict_Unwatch(int watcher_id, PyObject* dict)
78837882 if (validate_watcher_id (interp , watcher_id )) {
78847883 return -1 ;
78857884 }
7886- Py_BEGIN_CRITICAL_SECTION (dict );
7887- ((PyDictObject * )dict )-> _ma_watcher_tag &= ~(1ULL << watcher_id );
7888- Py_END_CRITICAL_SECTION ();
7885+ FT_ATOMIC_AND_UINT64 (((PyDictObject * )dict )-> _ma_watcher_tag ,
7886+ ~(1ULL << watcher_id ));
78897887 return 0 ;
78907888}
78917889
@@ -7895,7 +7893,8 @@ PyDict_AddWatcher(PyDict_WatchCallback callback)
78957893 int watcher_id = -1 ;
78967894 PyInterpreterState * interp = _PyInterpreterState_GET ();
78977895
7898- FT_MUTEX_LOCK (& interp -> dict_state .watcher_mutex );
7896+ FT_MUTEX_LOCK_FLAGS (& interp -> dict_state .watcher_mutex ,
7897+ _Py_LOCK_DONT_DETACH );
78997898 /* Some watchers are reserved for CPython, start at the first available one */
79007899 for (int i = FIRST_AVAILABLE_WATCHER ; i < DICT_MAX_WATCHERS ; i ++ ) {
79017900 if (!interp -> dict_state .watchers [i ]) {
@@ -7915,7 +7914,8 @@ PyDict_ClearWatcher(int watcher_id)
79157914{
79167915 int res = 0 ;
79177916 PyInterpreterState * interp = _PyInterpreterState_GET ();
7918- FT_MUTEX_LOCK (& interp -> dict_state .watcher_mutex );
7917+ FT_MUTEX_LOCK_FLAGS (& interp -> dict_state .watcher_mutex ,
7918+ _Py_LOCK_DONT_DETACH );
79197919 if (validate_watcher_id (interp , watcher_id )) {
79207920 res = -1 ;
79217921 goto done ;
0 commit comments