@@ -1012,6 +1012,8 @@ set_version_raw(uintptr_t *ptr, uint32_t version)
1012
1012
static void
1013
1013
set_global_version (PyThreadState * tstate , uint32_t version )
1014
1014
{
1015
+ ASSERT_WORLD_STOPPED ();
1016
+
1015
1017
assert ((version & _PY_EVAL_EVENTS_MASK ) == 0 );
1016
1018
PyInterpreterState * interp = tstate -> interp ;
1017
1019
set_version_raw (& interp -> ceval .instrumentation_version , version );
@@ -1908,28 +1910,27 @@ _Py_Instrument(PyCodeObject *code, PyInterpreterState *interp)
1908
1910
1909
1911
1910
1912
static int
1911
- instrument_all_executing_code_objects (PyInterpreterState * interp ) {
1913
+ instrument_all_executing_code_objects (PyInterpreterState * interp )
1914
+ {
1912
1915
ASSERT_WORLD_STOPPED ();
1913
1916
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 ) {
1919
1920
_PyInterpreterFrame * frame = ts -> current_frame ;
1920
1921
while (frame ) {
1921
1922
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 ;
1924
1926
}
1925
1927
}
1926
1928
frame = frame -> previous ;
1927
1929
}
1928
- HEAD_LOCK (runtime );
1929
- ts = PyThreadState_Next (ts );
1930
- HEAD_UNLOCK (runtime );
1931
1930
}
1932
- return 0 ;
1931
+ done :
1932
+ HEAD_UNLOCK (& _PyRuntime );
1933
+ return err ;
1933
1934
}
1934
1935
1935
1936
static void
@@ -1975,6 +1976,7 @@ check_tool(PyInterpreterState *interp, int tool_id)
1975
1976
int
1976
1977
_PyMonitoring_SetEvents (int tool_id , _PyMonitoringEventSet events )
1977
1978
{
1979
+ ASSERT_WORLD_STOPPED ();
1978
1980
assert (0 <= tool_id && tool_id < PY_MONITORING_TOOL_IDS );
1979
1981
PyThreadState * tstate = _PyThreadState_GET ();
1980
1982
PyInterpreterState * interp = tstate -> interp ;
@@ -1983,33 +1985,28 @@ _PyMonitoring_SetEvents(int tool_id, _PyMonitoringEventSet events)
1983
1985
return -1 ;
1984
1986
}
1985
1987
1986
- int res ;
1987
- _PyEval_StopTheWorld (interp );
1988
1988
uint32_t existing_events = get_events (& interp -> monitors , tool_id );
1989
1989
if (existing_events == events ) {
1990
- res = 0 ;
1991
- goto done ;
1990
+ return 0 ;
1992
1991
}
1993
1992
set_events (& interp -> monitors , tool_id , events );
1994
1993
uint32_t new_version = global_version (interp ) + MONITORING_VERSION_INCREMENT ;
1995
1994
if (new_version == 0 ) {
1996
1995
PyErr_Format (PyExc_OverflowError , "events set too many times" );
1997
- res = -1 ;
1998
- goto done ;
1996
+ return -1 ;
1999
1997
}
2000
1998
set_global_version (tstate , new_version );
2001
1999
#ifdef _Py_TIER2
2002
2000
_Py_Executors_InvalidateAll (interp , 1 );
2003
2001
#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 );
2008
2003
}
2009
2004
2010
2005
int
2011
2006
_PyMonitoring_SetLocalEvents (PyCodeObject * code , int tool_id , _PyMonitoringEventSet events )
2012
2007
{
2008
+ ASSERT_WORLD_STOPPED ();
2009
+
2013
2010
assert (0 <= tool_id && tool_id < PY_MONITORING_TOOL_IDS );
2014
2011
PyInterpreterState * interp = _PyInterpreterState_GET ();
2015
2012
assert (events < (1 << _PY_MONITORING_LOCAL_EVENTS ));
@@ -2021,26 +2018,18 @@ _PyMonitoring_SetLocalEvents(PyCodeObject *code, int tool_id, _PyMonitoringEvent
2021
2018
return -1 ;
2022
2019
}
2023
2020
2024
- int res ;
2025
- _PyEval_StopTheWorld (interp );
2026
2021
if (allocate_instrumentation_data (code )) {
2027
- res = -1 ;
2028
- goto done ;
2022
+ return -1 ;
2029
2023
}
2030
2024
2031
2025
_Py_LocalMonitors * local = & code -> _co_monitoring -> local_monitors ;
2032
2026
uint32_t existing_events = get_local_events (local , tool_id );
2033
2027
if (existing_events == events ) {
2034
- res = 0 ;
2035
- goto done ;
2028
+ return 0 ;
2036
2029
}
2037
2030
set_local_events (local , tool_id , events );
2038
2031
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 );
2044
2033
}
2045
2034
2046
2035
int
@@ -2238,7 +2227,11 @@ monitoring_set_events_impl(PyObject *module, int tool_id, int event_set)
2238
2227
return NULL ;
2239
2228
}
2240
2229
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 ) {
2242
2235
return NULL ;
2243
2236
}
2244
2237
Py_RETURN_NONE ;
@@ -2315,7 +2308,11 @@ monitoring_set_local_events_impl(PyObject *module, int tool_id,
2315
2308
return NULL ;
2316
2309
}
2317
2310
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 ) {
2319
2316
return NULL ;
2320
2317
}
2321
2318
Py_RETURN_NONE ;
0 commit comments