mirror of
https://github.com/python/cpython.git
synced 2026-06-21 10:34:26 -04:00
gh-151436: Fix missing tstate->last_profiled_frame updates (#151437)
This commit is contained in:
committed by
GitHub
parent
eff805b7a7
commit
a8d74c062f
+2
-8
@@ -1974,15 +1974,8 @@ clear_gen_frame(PyThreadState *tstate, _PyInterpreterFrame * frame)
|
||||
void
|
||||
_PyEval_FrameClearAndPop(PyThreadState *tstate, _PyInterpreterFrame * frame)
|
||||
{
|
||||
// Update last_profiled_frame for remote profiler frame caching.
|
||||
// By this point, tstate->current_frame is already set to the parent frame.
|
||||
// Only update if we're popping the exact frame that was last profiled.
|
||||
// This avoids corrupting the cache when transient frames (called and returned
|
||||
// between profiler samples) update last_profiled_frame to addresses the
|
||||
// profiler never saw.
|
||||
if (tstate->last_profiled_frame != NULL && tstate->last_profiled_frame == frame) {
|
||||
tstate->last_profiled_frame = tstate->current_frame;
|
||||
}
|
||||
_PyThreadState_UpdateLastProfiledFrame(tstate, frame, tstate->current_frame);
|
||||
|
||||
if (frame->owner == FRAME_OWNED_BY_THREAD) {
|
||||
clear_thread_frame(tstate, frame);
|
||||
@@ -2008,6 +2001,7 @@ _PyEvalFramePushAndInit(PyThreadState *tstate, _PyStackRef func,
|
||||
_PyFrame_Initialize(tstate, frame, func, locals, code, 0, previous);
|
||||
if (initialize_locals(tstate, func_obj, frame->localsplus, args, argcount, kwnames)) {
|
||||
assert(frame->owner == FRAME_OWNED_BY_THREAD);
|
||||
_PyThreadState_UpdateLastProfiledFrame(tstate, frame, tstate->current_frame);
|
||||
clear_thread_frame(tstate, frame);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user