diff --git a/scripts/base/init-bare.zeek b/scripts/base/init-bare.zeek index 8377be801a..cd27134c73 100644 --- a/scripts/base/init-bare.zeek +++ b/scripts/base/init-bare.zeek @@ -2116,8 +2116,8 @@ global discarder_check_icmp: function(p: pkt_hdr): bool; ## Zeek's watchdog interval. const watchdog_interval = 10 sec &redef; -## The maximum number of timers to expire after processing each new -## packet. The value trades off spreading out the timer expiration load +## The maximum number of expired timers to process after processing each new +## packet. The value trades off spreading out the timer expiration load ## with possibly having to hold state longer. A value of 0 means ## "process all expired timers with each new packet". const max_timer_expires = 300 &redef; diff --git a/src/Timer.cc b/src/Timer.cc index 8b3ec37478..6908e81f95 100644 --- a/src/Timer.cc +++ b/src/Timer.cc @@ -111,6 +111,8 @@ void TimerMgr::InitPostScript() { if ( iosource_mgr ) iosource_mgr->Register(this, true); + + dispatch_all_expired = zeek::detail::max_timer_expires == 0; } void TimerMgr::Add(Timer* timer) @@ -142,7 +144,8 @@ void TimerMgr::Expire() int TimerMgr::DoAdvance(double new_t, int max_expire) { Timer* timer = Top(); - for ( num_expired = 0; (num_expired < max_expire) && timer && timer->Time() <= new_t; + for ( num_expired = 0; + (num_expired < max_expire || dispatch_all_expired) && timer && timer->Time() <= new_t; ++num_expired ) { last_timestamp = timer->Time(); diff --git a/src/Timer.h b/src/Timer.h index 883903512a..4592b4d953 100644 --- a/src/Timer.h +++ b/src/Timer.h @@ -84,7 +84,8 @@ public: void Add(Timer* timer); /** - * Advance the clock to time t, expiring at most max_expire timers. + * Advance the clock to time t, dispatching at most max_expire expired + * timers, or all expired timers if dispatch_all_expired is set. * * @param t the new time. * @param max_expire the maximum number of timers to expire. @@ -152,6 +153,9 @@ private: double last_advance; int num_expired; + // Flag to indicate if Advance() should dispatch all expired timers + // for the max_timer_expires=0 case. + bool dispatch_all_expired = false; size_t peak_size = 0; size_t cumulative_num = 0;