summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2022-07-29 08:43:52 (GMT)
committerGitHub <noreply@github.com>2022-07-29 08:43:52 (GMT)
commit00566a8124e16b8f9403395b42a722edef2b0583 (patch)
treec756e440a84a4f1f1a9d035e5308df3c203e7b55
parentf06f3656c5e98843d4666d22df0b2c5dd62c87ae (diff)
downloadcpython-00566a8124e16b8f9403395b42a722edef2b0583.zip
cpython-00566a8124e16b8f9403395b42a722edef2b0583.tar.gz
cpython-00566a8124e16b8f9403395b42a722edef2b0583.tar.bz2
GH-90081: Run python tracers at full speed (GH-95328) (#95363)
(cherry picked from commit b8b2990fb3218cffedfe7bc92e9e7ae2275b3c98) Co-authored-by: Mark Shannon <mark@hotpy.org> Co-authored-by: Mark Shannon <mark@hotpy.org>
-rw-r--r--Include/internal/pycore_pystate.h5
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2022-07-27-14-21-57.gh-issue-90081.HVAS5x.rst2
-rw-r--r--Python/ceval.c11
3 files changed, 12 insertions, 6 deletions
diff --git a/Include/internal/pycore_pystate.h b/Include/internal/pycore_pystate.h
index e2d7c5b..cb8f115 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 0000000..a3be34c
--- /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 31cdb55..23733b6 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -5590,7 +5590,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();
@@ -5620,9 +5620,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();
@@ -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