From: Mark Shannon Date: Thu, 28 Jul 2022 09:17:22 +0000 (+0100) Subject: GH-90081: Run python tracers at full speed (GH-95328) X-Git-Tag: v3.12.0a1~811 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=b8b2990fb3218cffedfe7bc92e9e7ae2275b3c98;p=thirdparty%2FPython%2Fcpython.git GH-90081: Run python tracers at full speed (GH-95328) --- diff --git a/Include/internal/pycore_pystate.h b/Include/internal/pycore_pystate.h index b4a39b62b76a..51d119c23e73 100644 --- a/Include/internal/pycore_pystate.h +++ b/Include/internal/pycore_pystate.h @@ -131,8 +131,9 @@ PyAPI_FUNC(void) _PyThreadState_DeleteExcept( static inline void _PyThreadState_UpdateTracingState(PyThreadState *tstate) { - int use_tracing = (tstate->c_tracefunc != NULL - || tstate->c_profilefunc != NULL); + bool use_tracing = + (tstate->tracing == 0) && + (tstate->c_tracefunc != NULL || tstate->c_profilefunc != NULL); tstate->cframe->use_tracing = (use_tracing ? 255 : 0); } diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-07-27-14-21-57.gh-issue-90081.HVAS5x.rst b/Misc/NEWS.d/next/Core and Builtins/2022-07-27-14-21-57.gh-issue-90081.HVAS5x.rst new file mode 100644 index 000000000000..a3be34c175af --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-07-27-14-21-57.gh-issue-90081.HVAS5x.rst @@ -0,0 +1,2 @@ +Run Python code in tracer/profiler function at full speed. Fixes slowdown in +earlier versions of 3.11. diff --git a/Python/ceval.c b/Python/ceval.c index 3a9b0e569f02..7ad26a70dd18 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -5631,7 +5631,7 @@ handle_eval_breaker: assert(oparg); oparg <<= 8; oparg |= _Py_OPARG(*next_instr); - // We might be tracing. To avoid breaking tracing guarantees in + // We might be tracing. To avoid breaking tracing guarantees in // quickened instructions, always deoptimize the next opcode: opcode = _PyOpcode_Deopt[_Py_OPCODE(*next_instr)]; PRE_DISPATCH_GOTO(); @@ -5661,9 +5661,9 @@ handle_eval_breaker: case DO_TRACING: #endif { - if (tstate->tracing == 0 && - INSTR_OFFSET() >= frame->f_code->_co_firsttraceable - ) { + assert(cframe.use_tracing); + assert(tstate->tracing == 0); + if (INSTR_OFFSET() >= frame->f_code->_co_firsttraceable) { int instr_prev = _PyInterpreterFrame_LASTI(frame); frame->prev_instr = next_instr; TRACING_NEXTOPARG(); @@ -6875,12 +6875,15 @@ void PyThreadState_EnterTracing(PyThreadState *tstate) { tstate->tracing++; + tstate->cframe->use_tracing = 0; } void PyThreadState_LeaveTracing(PyThreadState *tstate) { + assert(tstate->tracing > 0 && tstate->cframe->use_tracing == 0); tstate->tracing--; + _PyThreadState_UpdateTracingState(tstate); } static int