[Bugfix] Manipulate deferred executor slot only if tokens match (#22722)
This commit is contained in:
		
							parent
							
								
									3afa2a9439
								
							
						
					
					
						commit
						2661ee282a
					
				
					 1 changed files with 8 additions and 2 deletions
				
			
		| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue