diff options
Diffstat (limited to 'src/vppinfra')
-rw-r--r-- | src/vppinfra/tw_timer_template.c | 8 | ||||
-rw-r--r-- | src/vppinfra/tw_timer_template.h | 5 |
2 files changed, 10 insertions, 3 deletions
diff --git a/src/vppinfra/tw_timer_template.c b/src/vppinfra/tw_timer_template.c index 139d27ca09f..436dd4e1f66 100644 --- a/src/vppinfra/tw_timer_template.c +++ b/src/vppinfra/tw_timer_template.c @@ -170,13 +170,14 @@ void TW (tw_timer_stop) (TWT (tw_timer_wheel) * tw, u32 handle) void TW (tw_timer_wheel_init) (TWT (tw_timer_wheel) * tw, void *expired_timer_callback, - f64 timer_interval_in_seconds) + f64 timer_interval_in_seconds, u32 max_expirations) { int ring, slot; tw_timer_wheel_slot_t *ts; TWT (tw_timer) * t; memset (tw, 0, sizeof (*tw)); tw->expired_timer_callback = expired_timer_callback; + tw->max_expirations = max_expirations; if (timer_interval_in_seconds == 0.0) { clib_warning ("timer interval is zero"); @@ -258,7 +259,6 @@ u32 TW (tw_timer_expire_timers) (TWT (tw_timer_wheel) * tw, f64 now) /* Remember when we ran, compute next runtime */ tw->next_run_time = (now + tw->timer_interval); - tw->last_run_time = now; total_nexpirations = 0; for (i = 0; i < nticks; i++) @@ -332,8 +332,12 @@ u32 TW (tw_timer_expire_timers) (TWT (tw_timer_wheel) * tw, f64 now) } tw->current_index[TW_TIMER_RING_FAST]++; tw->current_tick++; + + if (total_nexpirations >= tw->max_expirations) + break; } + tw->last_run_time += i * tw->ticks_per_second; return total_nexpirations; } diff --git a/src/vppinfra/tw_timer_template.h b/src/vppinfra/tw_timer_template.h index 2e41bcac5f8..6b61e424f69 100644 --- a/src/vppinfra/tw_timer_template.h +++ b/src/vppinfra/tw_timer_template.h @@ -175,6 +175,9 @@ typedef struct /** vector of expired timers */ u32 *expired_timer_handles; + + /** maximum expirations */ + u32 max_expirations; } TWT (tw_timer_wheel); u32 TW (tw_timer_start) (TWT (tw_timer_wheel) * tw, @@ -184,7 +187,7 @@ void TW (tw_timer_stop) (TWT (tw_timer_wheel) * tw, u32 handle); void TW (tw_timer_wheel_init) (TWT (tw_timer_wheel) * tw, void *expired_timer_callback, - f64 timer_interval); + f64 timer_interval, u32 max_expirations); void TW (tw_timer_wheel_free) (TWT (tw_timer_wheel) * tw); |