Fix a bug in the timing wheel 81/3781/3
authorKlement Sekera <ksekera@cisco.com>
Fri, 11 Nov 2016 04:58:10 +0000 (05:58 +0100)
committerDave Barach <openvpp@barachs.net>
Sat, 12 Nov 2016 03:13:12 +0000 (03:13 +0000)
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>
vppinfra/vppinfra/timing_wheel.c

index 902140c..4c8a2c5 100644 (file)
@@ -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. */
-static void
+static u32 *
 advance_cpu_time_base (timing_wheel_t * w, u32 * expired_user_data)
 {
   timing_wheel_level_t *l;
@@ -519,6 +519,7 @@ advance_cpu_time_base (timing_wheel_t * w, u32 * expired_user_data)
     }));
     /* *INDENT-ON* */
   }
+  return expired_user_data;
 }
 
 static u32 *
@@ -683,7 +684,7 @@ timing_wheel_advance (timing_wheel_t * w, u64 advance_cpu_time,
   /* Don't advance until necessary. */
   while (PREDICT_FALSE
         (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)
     {