FreeRTOS: Modifying a timeout is now protected on multi-core configuration
@@ -3941,9 +3941,30 @@ void vTaskSetTimeOutState( TimeOut_t * const pxTimeOut )
void vTaskInternalSetTimeOutState( TimeOut_t * const pxTimeOut )
{
+ /**
+ * In case of we are building for SMP, we need to protect the following instructions in order to make them
+ * atomic.
+ * Indeed, without this, it would be possible to get preempted by the tick hook right after storing the number
+ * of overflows with `pxTimeOut->xOverflowCount = xNumOfOverflows`. Then, the tick hook increments the timer,
+ * which overflows, and thus resets the xTickCount to 0.
+ * Resuming our task would result in an invalid state of the timer where the number of overflow corresponds
+ * to the previous value and not the current one.
+ *
+ * On a single core configuration, this problem doesn't appear as this function is meant to be called from
+ * a critical section, disabling the (tick) interrupts.
+ */
+ #if ( ( ESP_PLATFORM == 1 ) && ( configNUM_CORES > 1 ) )
+ configASSERT( pxTimeOut );
+ taskENTER_CRITICAL();
+ #endif // ( ( ESP_PLATFORM == 1 ) && ( configNUM_CORES > 1 ) )
+
/* For internal use only as it does not use a critical section. */
pxTimeOut->xOverflowCount = xNumOfOverflows;
pxTimeOut->xTimeOnEntering = xTickCount;
+
+ #if ( ( ESP_PLATFORM == 1 ) && ( configNUM_CORES > 1 ) )
+ taskEXIT_CRITICAL();
+ #endif // ( ( ESP_PLATFORM == 1 ) && ( configNUM_CORES > 1 ) )
}
/*-----------------------------------------------------------*/
