Fix a bug in the timing wheel
Properly propagate vector allocated in advance_cpu_time_base() for a special case, when the expired_user_data parameter passed to timing_wheel_advance() is NULL and the only expired event is in the overflow pool. Change-Id: I5cefab0e881958334791aaa6354ec08225af23c1 Signed-off-by: Klement Sekera <ksekera@cisco.com>
This commit is contained in:

committed by
Dave Barach

parent
7f3c36bb85
commit
e5af88c820
@ -468,7 +468,7 @@ expire_bin (timing_wheel_t * w,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Called rarely. 32 bit times should only overflow every 4 seconds or so on a fast machine. */
|
/* Called rarely. 32 bit times should only overflow every 4 seconds or so on a fast machine. */
|
||||||
static void
|
static u32 *
|
||||||
advance_cpu_time_base (timing_wheel_t * w, u32 * expired_user_data)
|
advance_cpu_time_base (timing_wheel_t * w, u32 * expired_user_data)
|
||||||
{
|
{
|
||||||
timing_wheel_level_t *l;
|
timing_wheel_level_t *l;
|
||||||
@ -519,6 +519,7 @@ advance_cpu_time_base (timing_wheel_t * w, u32 * expired_user_data)
|
|||||||
}));
|
}));
|
||||||
/* *INDENT-ON* */
|
/* *INDENT-ON* */
|
||||||
}
|
}
|
||||||
|
return expired_user_data;
|
||||||
}
|
}
|
||||||
|
|
||||||
static u32 *
|
static u32 *
|
||||||
@ -683,7 +684,7 @@ timing_wheel_advance (timing_wheel_t * w, u64 advance_cpu_time,
|
|||||||
/* Don't advance until necessary. */
|
/* Don't advance until necessary. */
|
||||||
while (PREDICT_FALSE
|
while (PREDICT_FALSE
|
||||||
(advance_time_index >= w->time_index_next_cpu_time_base_update))
|
(advance_time_index >= w->time_index_next_cpu_time_base_update))
|
||||||
advance_cpu_time_base (w, expired_user_data);
|
expired_user_data = advance_cpu_time_base (w, expired_user_data);
|
||||||
|
|
||||||
if (next_expiring_element_cpu_time)
|
if (next_expiring_element_cpu_time)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user