@@ -707,29 +707,19 @@ ThreadInfo::unwind_greenlets(EchionSampler& echion, PyThreadState* tstate, unsig
707707 }
708708}
709709
710- // ----------------------------------------------------------------------------
711- Result<void >
712- ThreadInfo::sample (EchionSampler& echion, PyThreadState* tstate, microsecond_t delta)
710+ namespace {
711+
712+ void
713+ render_unwound_stacks (EchionSampler& echion, ThreadInfo& thread)
713714{
714715 auto & renderer = echion.renderer ();
715- renderer.render_thread_begin (tstate, name, delta, thread_id, native_id);
716-
717- microsecond_t previous_cpu_time = cpu_time;
718- auto update_cpu_time_success = update_cpu_time ();
719- if (!update_cpu_time_success) {
720- return ErrorKind::CpuTimeError;
721- }
722-
723- renderer.render_cpu_time (cpu_time - previous_cpu_time);
724-
725- this ->unwind (echion, tstate);
726716
727717 // Render in this order of priority
728718 // 1. asyncio Tasks stacks (if any)
729719 // 2. Greenlets stacks (if any)
730720 // 3. The normal thread stack (if no asyncio tasks or greenlets)
731- if (!current_tasks.empty ()) {
732- for (auto & task_stack_info : current_tasks) {
721+ if (!thread. current_tasks .empty ()) {
722+ for (auto & task_stack_info : thread. current_tasks ) {
733723 task_stack_info->task_name .visit_string (
734724 [&](std::string_view task_name) { renderer.render_task_begin (task_name, task_stack_info->on_cpu ); });
735725
@@ -738,9 +728,9 @@ ThreadInfo::sample(EchionSampler& echion, PyThreadState* tstate, microsecond_t d
738728 renderer.render_stack_end ();
739729 }
740730
741- current_tasks.clear ();
742- } else if (!current_greenlets.empty ()) {
743- for (auto & greenlet_stack : current_greenlets) {
731+ thread. current_tasks .clear ();
732+ } else if (!thread. current_greenlets .empty ()) {
733+ for (auto & greenlet_stack : thread. current_greenlets ) {
744734 greenlet_stack->task_name .visit_string (
745735 [&](std::string_view task_name) { renderer.render_task_begin (task_name, greenlet_stack->on_cpu ); });
746736
@@ -750,11 +740,32 @@ ThreadInfo::sample(EchionSampler& echion, PyThreadState* tstate, microsecond_t d
750740 renderer.render_stack_end ();
751741 }
752742
753- current_greenlets.clear ();
743+ thread. current_greenlets .clear ();
754744 } else {
755- python_stack.render (echion);
745+ thread. python_stack .render (echion);
756746 renderer.render_stack_end ();
757747 }
748+ }
749+
750+ } // namespace
751+
752+ // ----------------------------------------------------------------------------
753+ Result<void >
754+ ThreadInfo::sample (EchionSampler& echion, PyThreadState* tstate, microsecond_t delta)
755+ {
756+ auto & renderer = echion.renderer ();
757+ renderer.render_thread_begin (tstate, name, delta, thread_id, native_id);
758+
759+ microsecond_t previous_cpu_time = cpu_time;
760+ auto update_cpu_time_success = update_cpu_time ();
761+ if (!update_cpu_time_success) {
762+ return ErrorKind::CpuTimeError;
763+ }
764+
765+ renderer.render_cpu_time (cpu_time - previous_cpu_time);
766+
767+ this ->unwind (echion, tstate);
768+ render_unwound_stacks (echion, *this );
758769
759770 return Result<void >::ok ();
760771}
0 commit comments