Explorar el Código

[Bugfix] Manipulate deferred executor slot only if tokens match (#22722)

Nick Brassel hace 2 años
padre
commit
2661ee282a
Se han modificado 1 ficheros con 8 adiciones y 2 borrados
  1. 8 2
      quantum/deferred_exec.c

+ 8 - 2
quantum/deferred_exec.c

@@ -124,13 +124,19 @@ void deferred_exec_advanced_task(deferred_executor_t *table, size_t table_count,
 
 
         // Run through each of the executors
         // Run through each of the executors
         for (int i = 0; i < table_count; ++i) {
         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
             // 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
                 // Invoke the callback and work work out if we should be requeued
                 uint32_t delay_ms = entry->callback(entry->trigger_time, entry->cb_arg);
                 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
                 // Update the trigger time if we have to repeat, otherwise clear it out
                 if (delay_ms > 0) {
                 if (delay_ms > 0) {
                     // Intentionally add just the delay to the existing trigger time -- this ensures the next
                     // Intentionally add just the delay to the existing trigger time -- this ensures the next