diff options
author | Victor Stinner <vstinner@python.org> | 2021-10-15 14:06:30 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-10-15 14:06:30 (GMT) |
commit | 547d26aa08aa5e4ec6e4f8a5587b30b39064a5ba (patch) | |
tree | f89a1327f1847ca97929efec97a12cab09478b2a /Python/ceval.c | |
parent | 354c35220d25a893e502014478f6739dad6897f3 (diff) | |
download | cpython-547d26aa08aa5e4ec6e4f8a5587b30b39064a5ba.zip cpython-547d26aa08aa5e4ec6e4f8a5587b30b39064a5ba.tar.gz cpython-547d26aa08aa5e4ec6e4f8a5587b30b39064a5ba.tar.bz2 |
bpo-43760: Add PyThreadState_EnterTracing() (GH-28542)
Add PyThreadState_EnterTracing() and PyThreadState_LeaveTracing()
functions to the limited C API to suspend and resume tracing and
profiling.
Add an unit test on the PyThreadState C API to _testcapi.
Add also internal _PyThreadState_DisableTracing() and
_PyThreadState_ResetTracing().
Diffstat (limited to 'Python/ceval.c')
-rw-r--r-- | Python/ceval.c | 17 |
1 files changed, 7 insertions, 10 deletions
diff --git a/Python/ceval.c b/Python/ceval.c index de71ae5..8986872 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -6187,7 +6187,7 @@ call_trace(Py_tracefunc func, PyObject *obj, if (tstate->tracing) return 0; tstate->tracing++; - tstate->cframe->use_tracing = 0; + _PyThreadState_DisableTracing(tstate); PyFrameObject *f = _PyFrame_GetFrameObject(frame); if (f == NULL) { return -1; @@ -6201,8 +6201,7 @@ call_trace(Py_tracefunc func, PyObject *obj, } result = func(obj, f, what, arg); f->f_lineno = 0; - tstate->cframe->use_tracing = ((tstate->c_tracefunc != NULL) - || (tstate->c_profilefunc != NULL)) ? 255 : 0; + _PyThreadState_ResetTracing(tstate); tstate->tracing--; return result; } @@ -6216,8 +6215,7 @@ _PyEval_CallTracing(PyObject *func, PyObject *args) PyObject *result; tstate->tracing = 0; - tstate->cframe->use_tracing = ((tstate->c_tracefunc != NULL) - || (tstate->c_profilefunc != NULL)) ? 255 : 0; + _PyThreadState_ResetTracing(tstate); result = PyObject_Call(func, args, NULL); tstate->tracing = save_tracing; tstate->cframe->use_tracing = save_use_tracing; @@ -6274,7 +6272,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 */ - tstate->cframe->use_tracing = tstate->c_tracefunc != NULL; + _PyThreadState_ResetTracing(tstate); Py_XDECREF(profileobj); Py_XINCREF(arg); @@ -6282,7 +6280,7 @@ _PyEval_SetProfile(PyThreadState *tstate, Py_tracefunc func, PyObject *arg) tstate->c_profilefunc = func; /* Flag that tracing or profiling is turned on */ - tstate->cframe->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL) ? 255 : 0; + _PyThreadState_ResetTracing(tstate); return 0; } @@ -6315,7 +6313,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 */ - tstate->cframe->use_tracing = (tstate->c_profilefunc != NULL) ? 255 : 0; + _PyThreadState_ResetTracing(tstate); Py_XDECREF(traceobj); Py_XINCREF(arg); @@ -6323,8 +6321,7 @@ _PyEval_SetTrace(PyThreadState *tstate, Py_tracefunc func, PyObject *arg) tstate->c_tracefunc = func; /* Flag that tracing or profiling is turned on */ - tstate->cframe->use_tracing = ((func != NULL) - || (tstate->c_profilefunc != NULL)) ? 255 : 0; + _PyThreadState_ResetTracing(tstate); return 0; } |