@@ -1040,6 +1040,8 @@ set_version_raw(uintptr_t *ptr, uint32_t version)
1040
1040
static void
1041
1041
set_global_version (PyThreadState * tstate , uint32_t version )
1042
1042
{
1043
+ ASSERT_WORLD_STOPPED ();
1044
+
1043
1045
assert ((version & _PY_EVAL_EVENTS_MASK ) == 0 );
1044
1046
PyInterpreterState * interp = tstate -> interp ;
1045
1047
set_version_raw (& interp -> ceval .instrumentation_version , version );
@@ -1939,28 +1941,26 @@ _Py_Instrument(PyCodeObject *code, PyInterpreterState *interp)
1939
1941
1940
1942
1941
1943
static int
1942
- instrument_all_executing_code_objects (PyInterpreterState * interp ) {
1944
+ instrument_all_executing_code_objects (PyInterpreterState * interp )
1945
+ {
1943
1946
ASSERT_WORLD_STOPPED ();
1944
1947
1945
- _PyRuntimeState * runtime = & _PyRuntime ;
1946
- HEAD_LOCK (runtime );
1947
- PyThreadState * ts = PyInterpreterState_ThreadHead (interp );
1948
- HEAD_UNLOCK (runtime );
1949
- while (ts ) {
1948
+ int err = 0 ;
1949
+ _Py_FOR_EACH_TSTATE_BEGIN (interp , ts ) {
1950
1950
_PyInterpreterFrame * frame = ts -> current_frame ;
1951
1951
while (frame ) {
1952
1952
if (frame -> owner < FRAME_OWNED_BY_INTERPRETER ) {
1953
- if (instrument_lock_held (_PyFrame_GetCode (frame ), interp )) {
1954
- return -1 ;
1953
+ err = instrument_lock_held (_PyFrame_GetCode (frame ), interp );
1954
+ if (err ) {
1955
+ goto done ;
1955
1956
}
1956
1957
}
1957
1958
frame = frame -> previous ;
1958
1959
}
1959
- HEAD_LOCK (runtime );
1960
- ts = PyThreadState_Next (ts );
1961
- HEAD_UNLOCK (runtime );
1962
1960
}
1963
- return 0 ;
1961
+ done :
1962
+ _Py_FOR_EACH_TSTATE_END (interp );
1963
+ return err ;
1964
1964
}
1965
1965
1966
1966
static void
@@ -2006,6 +2006,7 @@ check_tool(PyInterpreterState *interp, int tool_id)
2006
2006
int
2007
2007
_PyMonitoring_SetEvents (int tool_id , _PyMonitoringEventSet events )
2008
2008
{
2009
+ ASSERT_WORLD_STOPPED ();
2009
2010
assert (0 <= tool_id && tool_id < PY_MONITORING_TOOL_IDS );
2010
2011
PyThreadState * tstate = _PyThreadState_GET ();
2011
2012
PyInterpreterState * interp = tstate -> interp ;
@@ -2014,33 +2015,28 @@ _PyMonitoring_SetEvents(int tool_id, _PyMonitoringEventSet events)
2014
2015
return -1 ;
2015
2016
}
2016
2017
2017
- int res ;
2018
- _PyEval_StopTheWorld (interp );
2019
2018
uint32_t existing_events = get_events (& interp -> monitors , tool_id );
2020
2019
if (existing_events == events ) {
2021
- res = 0 ;
2022
- goto done ;
2020
+ return 0 ;
2023
2021
}
2024
2022
set_events (& interp -> monitors , tool_id , events );
2025
2023
uint32_t new_version = global_version (interp ) + MONITORING_VERSION_INCREMENT ;
2026
2024
if (new_version == 0 ) {
2027
2025
PyErr_Format (PyExc_OverflowError , "events set too many times" );
2028
- res = -1 ;
2029
- goto done ;
2026
+ return -1 ;
2030
2027
}
2031
2028
set_global_version (tstate , new_version );
2032
2029
#ifdef _Py_TIER2
2033
2030
_Py_Executors_InvalidateAll (interp , 1 );
2034
2031
#endif
2035
- res = instrument_all_executing_code_objects (interp );
2036
- done :
2037
- _PyEval_StartTheWorld (interp );
2038
- return res ;
2032
+ return instrument_all_executing_code_objects (interp );
2039
2033
}
2040
2034
2041
2035
int
2042
2036
_PyMonitoring_SetLocalEvents (PyCodeObject * code , int tool_id , _PyMonitoringEventSet events )
2043
2037
{
2038
+ ASSERT_WORLD_STOPPED ();
2039
+
2044
2040
assert (0 <= tool_id && tool_id < PY_MONITORING_TOOL_IDS );
2045
2041
PyInterpreterState * interp = _PyInterpreterState_GET ();
2046
2042
assert (events < (1 << _PY_MONITORING_LOCAL_EVENTS ));
@@ -2052,28 +2048,20 @@ _PyMonitoring_SetLocalEvents(PyCodeObject *code, int tool_id, _PyMonitoringEvent
2052
2048
return -1 ;
2053
2049
}
2054
2050
2055
- int res ;
2056
- _PyEval_StopTheWorld (interp );
2057
2051
if (allocate_instrumentation_data (code )) {
2058
- res = -1 ;
2059
- goto done ;
2052
+ return -1 ;
2060
2053
}
2061
2054
2062
2055
code -> _co_monitoring -> tool_versions [tool_id ] = interp -> monitoring_tool_versions [tool_id ];
2063
2056
2064
2057
_Py_LocalMonitors * local = & code -> _co_monitoring -> local_monitors ;
2065
2058
uint32_t existing_events = get_local_events (local , tool_id );
2066
2059
if (existing_events == events ) {
2067
- res = 0 ;
2068
- goto done ;
2060
+ return 0 ;
2069
2061
}
2070
2062
set_local_events (local , tool_id , events );
2071
2063
2072
- res = force_instrument_lock_held (code , interp );
2073
-
2074
- done :
2075
- _PyEval_StartTheWorld (interp );
2076
- return res ;
2064
+ return force_instrument_lock_held (code , interp );
2077
2065
}
2078
2066
2079
2067
int
@@ -2105,11 +2093,12 @@ int _PyMonitoring_ClearToolId(int tool_id)
2105
2093
}
2106
2094
}
2107
2095
2096
+ _PyEval_StopTheWorld (interp );
2108
2097
if (_PyMonitoring_SetEvents (tool_id , 0 ) < 0 ) {
2098
+ _PyEval_StartTheWorld (interp );
2109
2099
return -1 ;
2110
2100
}
2111
2101
2112
- _PyEval_StopTheWorld (interp );
2113
2102
uint32_t version = global_version (interp ) + MONITORING_VERSION_INCREMENT ;
2114
2103
if (version == 0 ) {
2115
2104
PyErr_Format (PyExc_OverflowError , "events set too many times" );
@@ -2346,7 +2335,11 @@ monitoring_set_events_impl(PyObject *module, int tool_id, int event_set)
2346
2335
event_set &= ~(1 << PY_MONITORING_EVENT_BRANCH );
2347
2336
event_set |= (1 << PY_MONITORING_EVENT_BRANCH_RIGHT ) | (1 << PY_MONITORING_EVENT_BRANCH_LEFT );
2348
2337
}
2349
- if (_PyMonitoring_SetEvents (tool_id , event_set )) {
2338
+ PyInterpreterState * interp = _PyInterpreterState_GET ();
2339
+ _PyEval_StopTheWorld (interp );
2340
+ int err = _PyMonitoring_SetEvents (tool_id , event_set );
2341
+ _PyEval_StartTheWorld (interp );
2342
+ if (err ) {
2350
2343
return NULL ;
2351
2344
}
2352
2345
Py_RETURN_NONE ;
@@ -2427,7 +2420,11 @@ monitoring_set_local_events_impl(PyObject *module, int tool_id,
2427
2420
return NULL ;
2428
2421
}
2429
2422
2430
- if (_PyMonitoring_SetLocalEvents ((PyCodeObject * )code , tool_id , event_set )) {
2423
+ PyInterpreterState * interp = _PyInterpreterState_GET ();
2424
+ _PyEval_StopTheWorld (interp );
2425
+ int err = _PyMonitoring_SetLocalEvents ((PyCodeObject * )code , tool_id , event_set );
2426
+ _PyEval_StartTheWorld (interp );
2427
+ if (err ) {
2431
2428
return NULL ;
2432
2429
}
2433
2430
Py_RETURN_NONE ;
0 commit comments