diff --git a/kernel/timeout.c b/kernel/timeout.c index 877c2ae7187..09c5a117f35 100644 --- a/kernel/timeout.c +++ b/kernel/timeout.c @@ -90,20 +90,21 @@ void z_add_timeout(struct _timeout *to, _timeout_func_t fn, __ASSERT_NO_MSG(arch_mem_coherent(to)); #endif - k_ticks_t ticks = timeout.ticks + 1; - - if (IS_ENABLED(CONFIG_TIMEOUT_64BIT) && Z_TICK_ABS(ticks) >= 0) { - ticks = Z_TICK_ABS(timeout.ticks) - (curr_tick + elapsed()); - } - __ASSERT(!sys_dnode_is_linked(&to->node), ""); to->fn = fn; - ticks = MAX(1, ticks); LOCKED(&timeout_lock) { struct _timeout *t; - to->dticks = ticks + elapsed(); + if (IS_ENABLED(CONFIG_TIMEOUT_64BIT) && + Z_TICK_ABS(timeout.ticks) >= 0) { + k_ticks_t ticks = Z_TICK_ABS(timeout.ticks) - curr_tick; + + to->dticks = MAX(1, ticks); + } else { + to->dticks = timeout.ticks + 1 + elapsed(); + } + for (t = first(); t != NULL; t = next(t)) { if (t->dticks > to->dticks) { t->dticks -= to->dticks;