Skip to content

Commit d247d54

Browse files
committed
Refactor timer handler to support embedded list nodes
Previously, expired timers were placed into the expired_timers array and their list nodes were returned to timer_node_pool. With embedded list nodes, a timer only needs to be removed from the running timer list to stop further handling. This change updates timer handling to operate directly on embedded list nodes, aligning the handler logic with the embedded node design.
1 parent 3527b61 commit d247d54

File tree

1 file changed

+10
-9
lines changed

1 file changed

+10
-9
lines changed

kernel/timer.c

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -201,22 +201,21 @@ void _timer_tick_handler(void)
201201
if (unlikely(!timer_initialized || !kcb->timer_list ||
202202
list_is_empty(kcb->timer_list)))
203203
return;
204-
205204
uint32_t now = mo_ticks();
206-
timer_t *expired_timers[TIMER_BATCH_SIZE]; /* Smaller batch size */
205+
list_node_t *
206+
expired_timers_running_nodes[TIMER_BATCH_SIZE]; /* Smaller batch size */
207207
int expired_count = 0;
208208

209209
/* Collect expired timers in one pass, limited to batch size */
210210
while (!list_is_empty(kcb->timer_list) &&
211211
expired_count < TIMER_BATCH_SIZE) {
212212
list_node_t *node = kcb->timer_list->head->next;
213-
timer_t *t = (timer_t *) node->data;
213+
timer_t *t = timer_from_running_node(node);
214214

215215
if (now >= t->deadline_ticks) {
216-
expired_timers[expired_count++] = t;
217-
kcb->timer_list->head->next = node->next;
218-
kcb->timer_list->length--;
219-
return_timer_node(node);
216+
expired_timers_running_nodes[expired_count++] =
217+
list_pop(kcb->timer_list);
218+
220219
} else {
221220
/* First timer not expired, so none further down are */
222221
break;
@@ -225,7 +224,8 @@ void _timer_tick_handler(void)
225224

226225
/* Process all expired timers */
227226
for (int i = 0; i < expired_count; i++) {
228-
timer_t *t = expired_timers[i];
227+
list_node_t *expired_running_node = expired_timers_running_nodes[i];
228+
timer_t *t = timer_from_running_node(expired_running_node);
229229

230230
/* Execute callback */
231231
if (likely(t->callback))
@@ -236,7 +236,8 @@ void _timer_tick_handler(void)
236236
/* Calculate next expected fire tick to prevent cumulative error */
237237
t->last_expected_fire_tick += MS_TO_TICKS(t->period_ms);
238238
t->deadline_ticks = t->last_expected_fire_tick;
239-
timer_sorted_insert(t); /* Re-insert for next expiration */
239+
/* Re-insert for next expiration */
240+
timer_sorted_insert_running_list(t);
240241
} else {
241242
t->mode = TIMER_DISABLED; /* One-shot timers are done */
242243
}

0 commit comments

Comments
 (0)