Skip to content

Commit

Permalink
GH-90081: Run python tracers at full speed (GH-95328) (#95363)
Browse files Browse the repository at this point in the history
(cherry picked from commit b8b2990)

Co-authored-by: Mark Shannon <[email protected]>

Co-authored-by: Mark Shannon <[email protected]>
  • Loading branch information
miss-islington and markshannon authored Jul 29, 2022
1 parent f06f365 commit 00566a8
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 6 deletions.
5 changes: 3 additions & 2 deletions Include/internal/pycore_pystate.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Run Python code in tracer/profiler function at full speed. Fixes slowdown in
earlier versions of 3.11.
11 changes: 7 additions & 4 deletions Python/ceval.c
Original file line number Diff line number Diff line change
Expand Up @@ -5590,7 +5590,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int
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();
Expand Down Expand Up @@ -5620,9 +5620,9 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int
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();
Expand Down Expand Up @@ -6832,12 +6832,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
Expand Down

0 comments on commit 00566a8

Please sign in to comment.