From: Alan T. DeKok Date: Mon, 26 Sep 2022 16:20:49 +0000 (-0400) Subject: track currently running / yielded instructions X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f0594e19290b7be8a41c3ef4a52b23c18c0db968;p=thirdparty%2Ffreeradius-server.git track currently running / yielded instructions --- diff --git a/src/lib/unlang/compile.c b/src/lib/unlang/compile.c index 6fb32f2a578..fa585f83031 100644 --- a/src/lib/unlang/compile.c +++ b/src/lib/unlang/compile.c @@ -4438,6 +4438,7 @@ void unlang_frame_perf_init(unlang_stack_frame_t *frame) t = &unlang_thread_array[instruction->number]; t->use_count++; + t->yielded++; // everything starts off as yielded now = fr_time(); fr_time_tracking_start(NULL, &frame->tracking, now); @@ -4447,27 +4448,37 @@ void unlang_frame_perf_init(unlang_stack_frame_t *frame) void unlang_frame_perf_yield(unlang_stack_frame_t *frame) { unlang_t const *instruction = frame->instruction; + unlang_thread_t *t; if (!instruction->number || !unlang_thread_array) return; + t = &unlang_thread_array[instruction->number]; + t->yielded++; + t->running--; + fr_time_tracking_yield(&frame->tracking, fr_time()); } void unlang_frame_perf_resume(unlang_stack_frame_t *frame) { unlang_t const *instruction = frame->instruction; + unlang_thread_t *t; if (!instruction->number || !unlang_thread_array) return; if (frame->tracking.state != FR_TIME_TRACKING_YIELDED) return; + t = &unlang_thread_array[instruction->number]; + t->running++; + t->yielded--; + fr_time_tracking_resume(&frame->tracking, fr_time()); } void unlang_frame_perf_cleanup(unlang_stack_frame_t *frame) { - unlang_thread_t *t; unlang_t const *instruction = frame->instruction; + unlang_thread_t *t; if (!instruction || !instruction->number || !unlang_thread_array) return; @@ -4475,7 +4486,12 @@ void unlang_frame_perf_cleanup(unlang_stack_frame_t *frame) t = &unlang_thread_array[instruction->number]; - if (frame->tracking.state == FR_TIME_TRACKING_YIELDED) fr_time_tracking_resume(&frame->tracking, fr_time()); + if (frame->tracking.state == FR_TIME_TRACKING_YIELDED) { + t->yielded--; + fr_time_tracking_resume(&frame->tracking, fr_time()); + } else { + t->running--; + } fr_time_tracking_end(NULL, &frame->tracking, fr_time()); t->tracking.running_total = fr_time_delta_add(t->tracking.running_total, frame->tracking.running_total); diff --git a/src/lib/unlang/unlang_priv.h b/src/lib/unlang/unlang_priv.h index c0ddbc01094..b5025aa85c9 100644 --- a/src/lib/unlang/unlang_priv.h +++ b/src/lib/unlang/unlang_priv.h @@ -229,7 +229,9 @@ typedef struct { unlang_t const *instruction; //!< instruction which we're executing void *thread_inst; //!< thread-specific instance data #ifdef WITH_PERF - uint64_t use_count; + uint64_t use_count; //!< how many packets it has processed + uint64_t running; //!< currently running this instruction + uint64_t yielded; //!< currently yielded fr_time_tracking_t tracking; //!< tracking cpu time #endif } unlang_thread_t;