aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFlorin Coras <fcoras@cisco.com>2018-08-01 16:25:45 -0700
committerDamjan Marion <dmarion@me.com>2018-08-03 09:12:02 +0000
commit40f92469c6c1b7145ad752475350f71d752d8033 (patch)
treed1fa31b60807adda3ffdbc2667b04e50f8ccf013
parentc470e22f12a68f06990f57f12f551fee50b6bb0d (diff)
vlib: avoid double process dispatch
Change-Id: I46467b1f149be9dfbd00e3ea6d60681d19acf235 Signed-off-by: Florin Coras <fcoras@cisco.com> Signed-off-by: Andrew Yourtchenko <ayourtch@gmail.com>
-rw-r--r--src/vlib/node_funcs.h10
-rw-r--r--src/vppinfra/tw_timer_template.c5
-rw-r--r--src/vppinfra/tw_timer_template.h1
3 files changed, 15 insertions, 1 deletions
diff --git a/src/vlib/node_funcs.h b/src/vlib/node_funcs.h
index 577e013c761..d848419cb3e 100644
--- a/src/vlib/node_funcs.h
+++ b/src/vlib/node_funcs.h
@@ -818,7 +818,15 @@ vlib_process_signal_event_helper (vlib_node_main_t * nm,
{
/* Waiting for both event and clock? */
if (p_flags & VLIB_PROCESS_IS_SUSPENDED_WAITING_FOR_EVENT)
- delete_from_wheel = 1;
+ {
+ if (!TW (tw_timer_handle_is_free)
+ ((TWT (tw_timer_wheel) *) nm->timing_wheel,
+ p->stop_timer_handle))
+ delete_from_wheel = 1;
+ else
+ /* timer just popped so process should already be on the list */
+ add_to_pending = 0;
+ }
else
/* Waiting only for clock. Event will be queue and may be
handled when timer expires. */
diff --git a/src/vppinfra/tw_timer_template.c b/src/vppinfra/tw_timer_template.c
index c96c329c931..9c9bb977d5e 100644
--- a/src/vppinfra/tw_timer_template.c
+++ b/src/vppinfra/tw_timer_template.c
@@ -376,6 +376,11 @@ void TW (tw_timer_stop) (TWT (tw_timer_wheel) * tw, u32 handle)
pool_put_index (tw->timers, handle);
}
+int TW (tw_timer_handle_is_free) (TWT (tw_timer_wheel) * tw, u32 handle)
+{
+ return pool_is_free_index (tw->timers, handle);
+}
+
/**
* @brief Update a tw timer
* @param tw_timer_wheel_t * tw timer wheel object pointer
diff --git a/src/vppinfra/tw_timer_template.h b/src/vppinfra/tw_timer_template.h
index b5cdac05506..e581f072f41 100644
--- a/src/vppinfra/tw_timer_template.h
+++ b/src/vppinfra/tw_timer_template.h
@@ -238,6 +238,7 @@ u32 TW (tw_timer_start) (TWT (tw_timer_wheel) * tw,
u32 pool_index, u32 timer_id, u64 interval);
void TW (tw_timer_stop) (TWT (tw_timer_wheel) * tw, u32 handle);
+int TW (tw_timer_handle_is_free) (TWT (tw_timer_wheel) * tw, u32 handle);
void TW (tw_timer_update) (TWT (tw_timer_wheel) * tw, u32 handle,
u64 interval);