freertos: Fix configASSERT thread safety

This commit fixes thread safety issues with configASSERT() calls
regarding the value of uxSchedulerSuspended. A false negative
occurs if a context switch to the opposite core occurs in between
the getting the core ID and the assesment.

Closes https://github.com/espressif/esp-idf/issues/4230
This commit is contained in:
Darian Leung 2019-11-05 21:49:13 +08:00
parent 49193beb6d
commit 79e74e5d5f

View file

@ -1301,7 +1301,7 @@ static void prvAddNewTaskToReadyList( TCB_t *pxNewTCB, TaskFunction_t pxTaskCode
//No mux; no harm done if this misfires. The deleted task won't get scheduled anyway.
if( pxTCB == pxCurrentTCB[ core ] ) //If task was currently running on this core
{
configASSERT( uxSchedulerSuspended[ core ] == 0 );
configASSERT( xTaskGetSchedulerState() == taskSCHEDULER_RUNNING )
/* The pre-delete hook is primarily for the Windows simulator,
in which Windows specific clean up operations are performed,
@ -1336,7 +1336,7 @@ static void prvAddNewTaskToReadyList( TCB_t *pxNewTCB, TaskFunction_t pxTaskCode
configASSERT( pxPreviousWakeTime );
configASSERT( ( xTimeIncrement > 0U ) );
configASSERT( uxSchedulerSuspended[ xPortGetCoreID() ] == 0 );
configASSERT( xTaskGetSchedulerState() == taskSCHEDULER_RUNNING );
taskENTER_CRITICAL(&xTaskQueueMutex);
// vTaskSuspendAll();
@ -1434,7 +1434,7 @@ static void prvAddNewTaskToReadyList( TCB_t *pxNewTCB, TaskFunction_t pxTaskCode
/* A delay time of zero just forces a reschedule. */
if( xTicksToDelay > ( TickType_t ) 0U )
{
configASSERT( uxSchedulerSuspended[ xPortGetCoreID() ] == 0 );
configASSERT( xTaskGetSchedulerState() == taskSCHEDULER_RUNNING );
taskENTER_CRITICAL(&xTaskQueueMutex);
// vTaskSuspendAll();
{
@ -1817,7 +1817,7 @@ static void prvAddNewTaskToReadyList( TCB_t *pxNewTCB, TaskFunction_t pxTaskCode
if( xSchedulerRunning != pdFALSE )
{
/* The current task has just been suspended. */
configASSERT( uxSchedulerSuspended[ xPortGetCoreID() ] == 0 );
configASSERT( xTaskGetSchedulerState() == taskSCHEDULER_RUNNING );
portYIELD_WITHIN_API();
}
else
@ -2213,7 +2213,7 @@ BaseType_t xAlreadyYielded = pdFALSE;
/* If uxSchedulerSuspended[ xPortGetCoreID() ] is zero then this function does not match a
previous call to vTaskSuspendAll(). */
configASSERT( uxSchedulerSuspended[ xPortGetCoreID() ] );
configASSERT( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED );
/* It is possible that an ISR caused a task to be removed from an event
list while the scheduler was suspended. If this was the case then the
removed task will have been added to the xPendingReadyList. Once the