@@ -1012,6 +1012,8 @@ set_version_raw(uintptr_t *ptr, uint32_t version)
10121012static void
10131013set_global_version (PyThreadState * tstate , uint32_t version )
10141014{
1015+ ASSERT_WORLD_STOPPED ();
1016+
10151017 assert ((version & _PY_EVAL_EVENTS_MASK ) == 0 );
10161018 PyInterpreterState * interp = tstate -> interp ;
10171019 set_version_raw (& interp -> ceval .instrumentation_version , version );
@@ -1908,28 +1910,27 @@ _Py_Instrument(PyCodeObject *code, PyInterpreterState *interp)
19081910
19091911
19101912static int
1911- instrument_all_executing_code_objects (PyInterpreterState * interp ) {
1913+ instrument_all_executing_code_objects (PyInterpreterState * interp )
1914+ {
19121915 ASSERT_WORLD_STOPPED ();
19131916
1914- _PyRuntimeState * runtime = & _PyRuntime ;
1915- HEAD_LOCK (runtime );
1916- PyThreadState * ts = PyInterpreterState_ThreadHead (interp );
1917- HEAD_UNLOCK (runtime );
1918- while (ts ) {
1917+ int err = 0 ;
1918+ HEAD_LOCK (& _PyRuntime );
1919+ for (PyThreadState * ts = interp -> threads .head ; ts != NULL ; ts = ts -> next ) {
19191920 _PyInterpreterFrame * frame = ts -> current_frame ;
19201921 while (frame ) {
19211922 if (frame -> owner != FRAME_OWNED_BY_CSTACK ) {
1922- if (instrument_lock_held (_PyFrame_GetCode (frame ), interp )) {
1923- return -1 ;
1923+ err = instrument_lock_held (_PyFrame_GetCode (frame ), interp );
1924+ if (err ) {
1925+ goto done ;
19241926 }
19251927 }
19261928 frame = frame -> previous ;
19271929 }
1928- HEAD_LOCK (runtime );
1929- ts = PyThreadState_Next (ts );
1930- HEAD_UNLOCK (runtime );
19311930 }
1932- return 0 ;
1931+ done :
1932+ HEAD_UNLOCK (& _PyRuntime );
1933+ return err ;
19331934}
19341935
19351936static void
@@ -1975,6 +1976,7 @@ check_tool(PyInterpreterState *interp, int tool_id)
19751976int
19761977_PyMonitoring_SetEvents (int tool_id , _PyMonitoringEventSet events )
19771978{
1979+ ASSERT_WORLD_STOPPED ();
19781980 assert (0 <= tool_id && tool_id < PY_MONITORING_TOOL_IDS );
19791981 PyThreadState * tstate = _PyThreadState_GET ();
19801982 PyInterpreterState * interp = tstate -> interp ;
@@ -1983,33 +1985,28 @@ _PyMonitoring_SetEvents(int tool_id, _PyMonitoringEventSet events)
19831985 return -1 ;
19841986 }
19851987
1986- int res ;
1987- _PyEval_StopTheWorld (interp );
19881988 uint32_t existing_events = get_events (& interp -> monitors , tool_id );
19891989 if (existing_events == events ) {
1990- res = 0 ;
1991- goto done ;
1990+ return 0 ;
19921991 }
19931992 set_events (& interp -> monitors , tool_id , events );
19941993 uint32_t new_version = global_version (interp ) + MONITORING_VERSION_INCREMENT ;
19951994 if (new_version == 0 ) {
19961995 PyErr_Format (PyExc_OverflowError , "events set too many times" );
1997- res = -1 ;
1998- goto done ;
1996+ return -1 ;
19991997 }
20001998 set_global_version (tstate , new_version );
20011999#ifdef _Py_TIER2
20022000 _Py_Executors_InvalidateAll (interp , 1 );
20032001#endif
2004- res = instrument_all_executing_code_objects (interp );
2005- done :
2006- _PyEval_StartTheWorld (interp );
2007- return res ;
2002+ return instrument_all_executing_code_objects (interp );
20082003}
20092004
20102005int
20112006_PyMonitoring_SetLocalEvents (PyCodeObject * code , int tool_id , _PyMonitoringEventSet events )
20122007{
2008+ ASSERT_WORLD_STOPPED ();
2009+
20132010 assert (0 <= tool_id && tool_id < PY_MONITORING_TOOL_IDS );
20142011 PyInterpreterState * interp = _PyInterpreterState_GET ();
20152012 assert (events < (1 << _PY_MONITORING_LOCAL_EVENTS ));
@@ -2021,26 +2018,18 @@ _PyMonitoring_SetLocalEvents(PyCodeObject *code, int tool_id, _PyMonitoringEvent
20212018 return -1 ;
20222019 }
20232020
2024- int res ;
2025- _PyEval_StopTheWorld (interp );
20262021 if (allocate_instrumentation_data (code )) {
2027- res = -1 ;
2028- goto done ;
2022+ return -1 ;
20292023 }
20302024
20312025 _Py_LocalMonitors * local = & code -> _co_monitoring -> local_monitors ;
20322026 uint32_t existing_events = get_local_events (local , tool_id );
20332027 if (existing_events == events ) {
2034- res = 0 ;
2035- goto done ;
2028+ return 0 ;
20362029 }
20372030 set_local_events (local , tool_id , events );
20382031
2039- res = force_instrument_lock_held (code , interp );
2040-
2041- done :
2042- _PyEval_StartTheWorld (interp );
2043- return res ;
2032+ return force_instrument_lock_held (code , interp );
20442033}
20452034
20462035int
@@ -2238,7 +2227,11 @@ monitoring_set_events_impl(PyObject *module, int tool_id, int event_set)
22382227 return NULL ;
22392228 }
22402229 event_set &= ~C_RETURN_EVENTS ;
2241- if (_PyMonitoring_SetEvents (tool_id , event_set )) {
2230+ PyInterpreterState * interp = _PyInterpreterState_GET ();
2231+ _PyEval_StopTheWorld (interp );
2232+ int err = _PyMonitoring_SetEvents (tool_id , event_set );
2233+ _PyEval_StartTheWorld (interp );
2234+ if (err ) {
22422235 return NULL ;
22432236 }
22442237 Py_RETURN_NONE ;
@@ -2315,7 +2308,11 @@ monitoring_set_local_events_impl(PyObject *module, int tool_id,
23152308 return NULL ;
23162309 }
23172310
2318- if (_PyMonitoring_SetLocalEvents ((PyCodeObject * )code , tool_id , event_set )) {
2311+ PyInterpreterState * interp = _PyInterpreterState_GET ();
2312+ _PyEval_StopTheWorld (interp );
2313+ int err = _PyMonitoring_SetLocalEvents ((PyCodeObject * )code , tool_id , event_set );
2314+ _PyEval_StartTheWorld (interp );
2315+ if (err ) {
23192316 return NULL ;
23202317 }
23212318 Py_RETURN_NONE ;
0 commit comments