From debca6dd3f285d8a234aa1d8c3902f75789a0cf2 Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Fri, 21 Feb 2025 11:44:22 -0400 Subject: [PATCH] MT#62181 wheeltimer: support absolute expiry Move determination of absolute expiry time up into insert_timer(), and make the rest of the code operate on absolute time. Add an extra method to directly support absolute time. Change-Id: I0a8dd27d82fb69b5083a6cfab693bfb275738495 --- core/sip/wheeltimer.cpp | 11 ++++++++--- core/sip/wheeltimer.h | 5 +++-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/core/sip/wheeltimer.cpp b/core/sip/wheeltimer.cpp index a67a24d6..1734d9d5 100644 --- a/core/sip/wheeltimer.cpp +++ b/core/sip/wheeltimer.cpp @@ -46,9 +46,14 @@ timer::~timer() } void _wheeltimer::insert_timer(timer* t, uint64_t relative_us) +{ + insert_timer_abs(t, (gettimeofday_us() + relative_us)); +} + +void _wheeltimer::insert_timer_abs(timer* t, uint64_t us) { std::lock_guard lock(buckets_mut); - place_timer(t, relative_us); + place_timer(t, us); // Wake up worker thread: The new timer might be the next one to run buckets_cond.notify_one(); } @@ -144,9 +149,9 @@ uint64_t _wheeltimer::get_timer_bucket(timer* t) return bucket; } -void _wheeltimer::place_timer(timer* t, uint64_t relative_us) +void _wheeltimer::place_timer(timer* t, uint64_t us) { - t->arm(relative_us); + t->arm(us); uint64_t bucket = get_timer_bucket(t); add_timer_to_bucket(t, bucket); } diff --git a/core/sip/wheeltimer.h b/core/sip/wheeltimer.h index ab9df65e..247a3e17 100644 --- a/core/sip/wheeltimer.h +++ b/core/sip/wheeltimer.h @@ -72,11 +72,11 @@ public: } private: - void arm(uint64_t relative) + void arm(uint64_t us) { if (expires) return; - expires = relative + gettimeofday_us(); + expires = us; } void link(timer_list& new_list) @@ -159,6 +159,7 @@ public: } void insert_timer(timer* t, uint64_t relative_expiry_us); + void insert_timer_abs(timer* t, uint64_t expiry_us); void remove_timer(timer* t); };