File tree Expand file tree Collapse file tree 1 file changed +14
-3
lines changed Expand file tree Collapse file tree 1 file changed +14
-3
lines changed Original file line number Diff line number Diff line change @@ -227,11 +227,14 @@ void _timer_tick_handler(void)
227227 /* Collect expired timers in one pass, limited to batch size */
228228 while (!list_is_empty (kcb -> timer_list ) &&
229229 expired_count < TIMER_BATCH_SIZE ) {
230- timer_t * t = (timer_t * ) kcb -> timer_list -> head -> next -> data ;
230+ list_node_t * node = kcb -> timer_list -> head -> next ;
231+ timer_t * t = (timer_t * ) node -> data ;
231232
232233 if (now >= t -> deadline_ticks ) {
233234 expired_timers [expired_count ++ ] = t ;
234- list_pop (kcb -> timer_list ); /* O(1) removal from head */
235+ kcb -> timer_list -> head -> next = node -> next ;
236+ kcb -> timer_list -> length -- ;
237+ return_timer_node (node );
235238 } else {
236239 /* First timer not expired, so none further down are */
237240 break ;
@@ -347,7 +350,15 @@ int32_t mo_timer_destroy(uint16_t id)
347350 }
348351
349352 /* Remove from master list */
350- list_remove (all_timers_list , node );
353+ list_node_t * prev = all_timers_list -> head ;
354+ while (prev -> next != all_timers_list -> tail && prev -> next != node )
355+ prev = prev -> next ;
356+
357+ if (likely (prev -> next == node )) {
358+ prev -> next = node -> next ;
359+ all_timers_list -> length -- ;
360+ }
361+
351362 free (t );
352363 return_timer_node (node );
353364
You can’t perform that action at this time.
0 commit comments