Skip to content

Commit fbbb1b5

Browse files
godlygeekpablogsal
authored andcommitted
Reuse clear from handleGreenletSwitch
Previously `PythonStackTracker::handleGreenletSwitch` cleared the shadow stack itself, rather than reusing the `PythonStackTracker::clear` method. The approach used by `handleGreenletSwitch` should be a little bit faster, so adopt it into `clear`. Also, switch `clear` to be private rather than public, since it's currently only used internally to the class. Signed-off-by: Matt Wozniski <[email protected]>
1 parent 6a187cd commit fbbb1b5

File tree

1 file changed

+6
-13
lines changed

1 file changed

+6
-13
lines changed

src/memray/_memray/tracking_api.cpp

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -162,8 +162,6 @@ class PythonStackTracker
162162
static void recordAllStacks();
163163
static void removeProfileHooks();
164164

165-
void clear();
166-
167165
static PythonStackTracker& get();
168166
void emitPendingPushesAndPops();
169167
void invalidateMostRecentFrameLineNumber();
@@ -179,6 +177,7 @@ class PythonStackTracker
179177

180178
static std::vector<LazilyEmittedFrame> pythonFrameToStack(PyFrameObject* current_frame);
181179
void reloadStackIfTrackerChanged();
180+
void clear();
182181

183182
static LazilyEmittedFrame createLazilyEmittedFrame(PyFrameObject* frame);
184183
void pushLazilyEmittedFrame(const LazilyEmittedFrame& frame);
@@ -507,13 +506,7 @@ PythonStackTracker::handleGreenletSwitch(PyObject* from, PyObject* to)
507506
RecursionGuard guard;
508507

509508
// Clear any old TLS stack, emitting pops for frames that had been pushed.
510-
if (d_stack) {
511-
d_num_pending_pops += std::count_if(d_stack->begin(), d_stack->end(), [](const auto& f) {
512-
return f.state != FrameState::NOT_EMITTED;
513-
});
514-
d_stack->clear();
515-
emitPendingPushesAndPops();
516-
}
509+
this->clear();
517510

518511
// Save current TID on old greenlet. Print errors but otherwise ignore them.
519512
PyObject* tid = PyLong_FromUnsignedLong(t_tid);
@@ -661,10 +654,10 @@ PythonStackTracker::clear()
661654
return;
662655
}
663656

664-
while (!d_stack->empty()) {
665-
d_num_pending_pops += (d_stack->back().state != FrameState::NOT_EMITTED);
666-
d_stack->pop_back();
667-
}
657+
d_num_pending_pops += std::count_if(d_stack->begin(), d_stack->end(), [](const auto& f) {
658+
return f.state != FrameState::NOT_EMITTED;
659+
});
660+
d_stack->clear();
668661
emitPendingPushesAndPops();
669662
}
670663

0 commit comments

Comments
 (0)