[Python-checkins] bpo-45923: Decouple suspension of tracing from tracing flag. (GH-31908)

markshannon webhook-mailer at python.org
Tue Mar 15 13:06:50 EDT 2022


https://github.com/python/cpython/commit/099f75614100e88ed90b68d20a51a8d9c22f81a7
commit: 099f75614100e88ed90b68d20a51a8d9c22f81a7
branch: main
author: Mark Shannon <mark at hotpy.org>
committer: markshannon <mark at hotpy.org>
date: 2022年03月15日T17:06:21Z
summary:
bpo-45923: Decouple suspension of tracing from tracing flag. (GH-31908)
files:
M Include/internal/pycore_pystate.h
M Python/ceval.c
M Python/pystate.c
diff --git a/Include/internal/pycore_pystate.h b/Include/internal/pycore_pystate.h
index f0c238a608b10..c4bc53c707fda 100644
--- a/Include/internal/pycore_pystate.h
+++ b/Include/internal/pycore_pystate.h
@@ -139,14 +139,9 @@ PyAPI_FUNC(void) _PyThreadState_DeleteExcept(
 _PyRuntimeState *runtime,
 PyThreadState *tstate);
 
-static inline void
-_PyThreadState_PauseTracing(PyThreadState *tstate)
-{
- tstate->cframe->use_tracing = 0;
-}
 
 static inline void
-_PyThreadState_ResumeTracing(PyThreadState *tstate)
+_PyThreadState_UpdateTracingState(PyThreadState *tstate)
 {
 int use_tracing = (tstate->c_tracefunc != NULL
 || tstate->c_profilefunc != NULL);
diff --git a/Python/ceval.c b/Python/ceval.c
index adbf1f689d908..d0fc31ec6c5d8 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -5439,10 +5439,12 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int
 }
 
 #if USE_COMPUTED_GOTOS
- TARGET_DO_TRACING: {
+ TARGET_DO_TRACING:
 #else
- case DO_TRACING: {
+ case DO_TRACING:
 #endif
+ {
+ if (tstate->tracing == 0) {
 int instr_prev = skip_backwards_over_extended_args(frame->f_code, frame->f_lasti);
 frame->f_lasti = INSTR_OFFSET();
 TRACING_NEXTOPARG();
@@ -5482,11 +5484,11 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int
 frame->stacktop = -1;
 }
 }
- TRACING_NEXTOPARG();
- PRE_DISPATCH_GOTO();
- DISPATCH_GOTO();
 }
-
+ TRACING_NEXTOPARG();
+ PRE_DISPATCH_GOTO();
+ DISPATCH_GOTO();
+ }
 
 #if USE_COMPUTED_GOTOS
 _unknown_opcode:
@@ -6673,27 +6675,38 @@ initialize_trace_info(PyTraceInfo *trace_info, _PyInterpreterFrame *frame)
 }
 }
 
+void
+PyThreadState_EnterTracing(PyThreadState *tstate)
+{
+ tstate->tracing++;
+}
+
+void
+PyThreadState_LeaveTracing(PyThreadState *tstate)
+{
+ tstate->tracing--;
+}
+
 static int
 call_trace(Py_tracefunc func, PyObject *obj,
 PyThreadState *tstate, _PyInterpreterFrame *frame,
 int what, PyObject *arg)
 {
 int result;
- if (tstate->tracing)
+ if (tstate->tracing) {
 return 0;
- tstate->tracing++;
- _PyThreadState_PauseTracing(tstate);
+ }
 PyFrameObject *f = _PyFrame_GetFrameObject(frame);
 if (f == NULL) {
 return -1;
 }
+ PyThreadState_EnterTracing(tstate);
 assert (frame->f_lasti >= 0);
 initialize_trace_info(&tstate->trace_info, frame);
 f->f_lineno = _PyCode_CheckLineNumber(frame->f_lasti*sizeof(_Py_CODEUNIT), &tstate->trace_info.bounds);
 result = func(obj, f, what, arg);
 f->f_lineno = 0;
- _PyThreadState_ResumeTracing(tstate);
- tstate->tracing--;
+ PyThreadState_LeaveTracing(tstate);
 return result;
 }
 
@@ -6706,7 +6719,6 @@ _PyEval_CallTracing(PyObject *func, PyObject *args)
 PyObject *result;
 
 tstate->tracing = 0;
- _PyThreadState_ResumeTracing(tstate);
 result = PyObject_Call(func, args, NULL);
 tstate->tracing = save_tracing;
 tstate->cframe->use_tracing = save_use_tracing;
@@ -6773,7 +6785,7 @@ _PyEval_SetProfile(PyThreadState *tstate, Py_tracefunc func, PyObject *arg)
 tstate->c_profilefunc = NULL;
 tstate->c_profileobj = NULL;
 /* Must make sure that tracing is not ignored if 'profileobj' is freed */
- _PyThreadState_ResumeTracing(tstate);
+ _PyThreadState_UpdateTracingState(tstate);
 Py_XDECREF(profileobj);
 
 Py_XINCREF(arg);
@@ -6781,7 +6793,7 @@ _PyEval_SetProfile(PyThreadState *tstate, Py_tracefunc func, PyObject *arg)
 tstate->c_profilefunc = func;
 
 /* Flag that tracing or profiling is turned on */
- _PyThreadState_ResumeTracing(tstate);
+ _PyThreadState_UpdateTracingState(tstate);
 return 0;
 }
 
@@ -6814,7 +6826,7 @@ _PyEval_SetTrace(PyThreadState *tstate, Py_tracefunc func, PyObject *arg)
 tstate->c_tracefunc = NULL;
 tstate->c_traceobj = NULL;
 /* Must make sure that profiling is not ignored if 'traceobj' is freed */
- _PyThreadState_ResumeTracing(tstate);
+ _PyThreadState_UpdateTracingState(tstate);
 Py_XDECREF(traceobj);
 
 Py_XINCREF(arg);
@@ -6822,7 +6834,7 @@ _PyEval_SetTrace(PyThreadState *tstate, Py_tracefunc func, PyObject *arg)
 tstate->c_tracefunc = func;
 
 /* Flag that tracing or profiling is turned on */
- _PyThreadState_ResumeTracing(tstate);
+ _PyThreadState_UpdateTracingState(tstate);
 
 return 0;
 }
diff --git a/Python/pystate.c b/Python/pystate.c
index edf2f62431f3d..1b4e31b95cd0b 100644
--- a/Python/pystate.c
+++ b/Python/pystate.c
@@ -1333,23 +1333,6 @@ PyThreadState_SetAsyncExc(unsigned long id, PyObject *exc)
 return 0;
 }
 
-
-void
-PyThreadState_EnterTracing(PyThreadState *tstate)
-{
- tstate->tracing++;
- _PyThreadState_PauseTracing(tstate);
-}
-
-void
-PyThreadState_LeaveTracing(PyThreadState *tstate)
-{
- tstate->tracing--;
- _PyThreadState_ResumeTracing(tstate);
-}
-
-
-
 /* Routines for advanced debuggers, requested by David Beazley.
 Don't use unless you know what you are doing! */
 


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /