~ruther/qmk_firmware

2661ee282a7edfdff299d2ccfc298dac75cf65e4 — Nick Brassel 1 year, 5 months ago 3afa2a9
[Bugfix] Manipulate deferred executor slot only if tokens match (#22722)

1 files changed, 8 insertions(+), 2 deletions(-)

M quantum/deferred_exec.c
M quantum/deferred_exec.c => quantum/deferred_exec.c +8 -2
@@ 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

Do not follow this link