From 178bb0e7014b4fe372e00c7603d0ac3ef8391e5e Mon Sep 17 00:00:00 2001 From: Vitaliy Filippov Date: Fri, 22 Dec 2023 02:32:40 +0300 Subject: [PATCH] Prevent re-entry into timerfd set_nearest --- src/timerfd_manager.cpp | 7 +++++++ src/timerfd_manager.h | 1 + 2 files changed, 8 insertions(+) diff --git a/src/timerfd_manager.cpp b/src/timerfd_manager.cpp index e94af8f3..c46f3f5f 100644 --- a/src/timerfd_manager.cpp +++ b/src/timerfd_manager.cpp @@ -90,6 +90,12 @@ void timerfd_manager_t::clear_timer(int timer_id) void timerfd_manager_t::set_nearest() { + if (onstack > 0) + { + // Prevent re-entry + return; + } + onstack++; again: if (!timers.size()) { @@ -139,6 +145,7 @@ again: } wait_state = wait_state | 1; } + onstack--; } void timerfd_manager_t::handle_readable() diff --git a/src/timerfd_manager.h b/src/timerfd_manager.h index 6bdad07d..d76b614d 100644 --- a/src/timerfd_manager.h +++ b/src/timerfd_manager.h @@ -22,6 +22,7 @@ class timerfd_manager_t int timerfd; int nearest = -1; int id = 1; + int onstack = 0; std::vector timers; void inc_timer(timerfd_timer_t & t);