]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
rework perf calls
authorAlan T. DeKok <aland@freeradius.org>
Sun, 25 Sep 2022 13:27:41 +0000 (09:27 -0400)
committerAlan T. DeKok <aland@freeradius.org>
Sun, 25 Sep 2022 13:27:41 +0000 (09:27 -0400)
to catch cases of retry / yield / abort / etc.

src/lib/unlang/compile.c
src/lib/unlang/interpret.c

index e4caa4acf8563761f26a1a3f032e5925c7de580c..6fb32f2a57849345ebc25f1680884cddd785a13a 100644 (file)
@@ -4441,7 +4441,7 @@ void unlang_frame_perf_init(unlang_stack_frame_t *frame)
        now = fr_time();
 
        fr_time_tracking_start(NULL, &frame->tracking, now);
-       fr_time_tracking_yield(&frame->tracking, now);
+       fr_time_tracking_yield(&frame->tracking, fr_time());
 }
 
 void unlang_frame_perf_yield(unlang_stack_frame_t *frame)
@@ -4459,6 +4459,8 @@ void unlang_frame_perf_resume(unlang_stack_frame_t *frame)
 
        if (!instruction->number || !unlang_thread_array) return;
 
+       if (frame->tracking.state != FR_TIME_TRACKING_YIELDED) return;
+
        fr_time_tracking_resume(&frame->tracking, fr_time());
 }
 
@@ -4473,6 +4475,8 @@ 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());
+
        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);
        t->tracking.waiting_total = fr_time_delta_add(t->tracking.waiting_total, frame->tracking.waiting_total);
index 0c75cf9769d9462dff16f3260a6b8b2cff8837a0..15bea9e69687f836bc1dc61196dfeff2740d25e8 100644 (file)
@@ -346,6 +346,7 @@ unlang_frame_action_t result_calculate(request_t *request, unlang_stack_frame_t
                REXDENT();
 
                talloc_free(frame->state);
+               unlang_frame_perf_cleanup(frame);
                frame_state_init(stack, frame);
                return UNLANG_FRAME_ACTION_RETRY;
        }
@@ -486,7 +487,6 @@ unlang_frame_action_t frame_eval(request_t *request, unlang_stack_frame_t *frame
                RDEBUG4("** [%i] %s >> %s", stack->depth, __FUNCTION__,
                        unlang_ops[instruction->type].name);
 
-               unlang_frame_perf_resume(frame);
                fr_assert(frame->process != NULL);
 
                /*