Skip to content

Commit

Permalink
[Bugfix] Ensure we only clear the deferred executor slot if the corre…
Browse files Browse the repository at this point in the history
…sponding callback hadn't already cleared it.
  • Loading branch information
tzarc committed Dec 20, 2023
1 parent c872888 commit 8490dcd
Showing 1 changed file with 8 additions and 2 deletions.
10 changes: 8 additions & 2 deletions quantum/deferred_exec.c
Original file line number Diff line number Diff line change
Expand Up @@ -124,13 +124,19 @@ void deferred_exec_advanced_task(deferred_executor_t *table, size_t table_count,

// Run through each of the executors
for (int i = 0; i < table_count; ++i) {
deferred_executor_t *entry = &table[i];
deferred_executor_t *entry = &table[i];
deferred_token curr_token = entry->token;

// Check if we're supposed to execute this entry
if (entry->token != INVALID_DEFERRED_TOKEN && ((int32_t)TIMER_DIFF_32(entry->trigger_time, now)) <= 0) {
if (curr_token != INVALID_DEFERRED_TOKEN && ((int32_t)TIMER_DIFF_32(entry->trigger_time, now)) <= 0) {
// Invoke the callback and work work out if we should be requeued
uint32_t delay_ms = entry->callback(entry->trigger_time, entry->cb_arg);

// If the token has changed, then the callback has canceled and re-queued. Skip further processing.
if (entry->token != curr_token) {
continue;
}

// Update the trigger time if we have to repeat, otherwise clear it out
if (delay_ms > 0) {
// Intentionally add just the delay to the existing trigger time -- this ensures the next
Expand Down

0 comments on commit 8490dcd

Please sign in to comment.