@@ -17,12 +17,14 @@ DEFINE_MTYPE_STATIC(LIB, TIMER_WHEEL_LIST, "Timer Wheel Slot List");
17
17
static int debug_timer_wheel = 0 ;
18
18
19
19
static void wheel_timer_thread (struct event * t );
20
+ static void wheel_pause (struct timer_wheel * wheel );
21
+ static void wheel_start (struct timer_wheel * wheel );
20
22
21
23
static void wheel_timer_thread (struct event * t )
22
24
{
23
25
struct listnode * node , * nextnode ;
24
26
unsigned long long curr_slot ;
25
- unsigned int slots_to_skip = 1 ;
27
+ int slots_to_skip = 1 ;
26
28
struct timer_wheel * wheel ;
27
29
void * data ;
28
30
@@ -47,6 +49,16 @@ static void wheel_timer_thread(struct event *t)
47
49
slots_to_skip ++ ;
48
50
49
51
wheel -> slots_to_skip = slots_to_skip ;
52
+ if ((((curr_slot + slots_to_skip ) % wheel -> slots ) == curr_slot ) &&
53
+ list_isempty (wheel -> wheel_slot_lists [curr_slot ])) {
54
+ /* Cam to back to same slot and that is empty
55
+ * so the wheel is empty, puase it
56
+ */
57
+ wheel_pause (wheel );
58
+ zlog_debug ("Pasued an empty wheel %p" , wheel );
59
+ return ;
60
+ }
61
+
50
62
event_add_timer_msec (wheel -> master , wheel_timer_thread , wheel ,
51
63
wheel -> nexttime * slots_to_skip , & wheel -> timer );
52
64
}
@@ -63,7 +75,6 @@ struct timer_wheel *wheel_init(struct event_loop *master, int period,
63
75
64
76
wheel -> slot_key = slot_key ;
65
77
wheel -> slot_run = slot_run ;
66
-
67
78
wheel -> period = period ;
68
79
wheel -> slots = slots ;
69
80
wheel -> curr_slot = 0 ;
@@ -75,9 +86,6 @@ struct timer_wheel *wheel_init(struct event_loop *master, int period,
75
86
for (i = 0 ; i < slots ; i ++ )
76
87
wheel -> wheel_slot_lists [i ] = list_new ();
77
88
78
- event_add_timer_msec (wheel -> master , wheel_timer_thread , wheel ,
79
- wheel -> nexttime , & wheel -> timer );
80
-
81
89
return wheel ;
82
90
}
83
91
@@ -104,7 +112,7 @@ int wheel_add_item(struct timer_wheel *wheel, void *item)
104
112
zlog_debug ("%s: Inserting %p: %lld %lld" , __func__ , item , slot ,
105
113
slot % wheel -> slots );
106
114
listnode_add (wheel -> wheel_slot_lists [slot % wheel -> slots ], item );
107
-
115
+ wheel_start ( wheel );
108
116
return 0 ;
109
117
}
110
118
@@ -121,3 +129,15 @@ int wheel_remove_item(struct timer_wheel *wheel, void *item)
121
129
122
130
return 0 ;
123
131
}
132
+
133
+ static void wheel_pause (struct timer_wheel * wheel )
134
+ {
135
+ EVENT_OFF (wheel -> timer );
136
+ }
137
+
138
+ static void wheel_start (struct timer_wheel * wheel )
139
+ {
140
+ if (!event_is_scheduled (wheel -> timer ))
141
+ event_add_timer_msec (wheel -> master , wheel_timer_thread , wheel , wheel -> nexttime ,
142
+ & wheel -> timer );
143
+ }
0 commit comments