mirror of
https://github.com/espressif/esp-idf.git
synced 2025-08-03 20:54:32 +02:00
Merge branch 'bugfix/scheduler_state_query_thread_safety_v4.3' into 'release/v4.3'
freertos: fix thread safety for checking scheduler state (v4.3) See merge request espressif/esp-idf!16131
This commit is contained in:
@@ -1421,7 +1421,7 @@ static void prvAddNewTaskToReadyList( TCB_t *pxNewTCB, TaskFunction_t pxTaskCode
|
|||||||
|
|
||||||
configASSERT( pxPreviousWakeTime );
|
configASSERT( pxPreviousWakeTime );
|
||||||
configASSERT( ( xTimeIncrement > 0U ) );
|
configASSERT( ( xTimeIncrement > 0U ) );
|
||||||
configASSERT( uxSchedulerSuspended[xPortGetCoreID()] == 0 );
|
configASSERT( xTaskGetSchedulerState() != taskSCHEDULER_SUSPENDED );
|
||||||
|
|
||||||
taskENTER_CRITICAL( &xTaskQueueMutex );
|
taskENTER_CRITICAL( &xTaskQueueMutex );
|
||||||
{
|
{
|
||||||
@@ -1505,7 +1505,7 @@ static void prvAddNewTaskToReadyList( TCB_t *pxNewTCB, TaskFunction_t pxTaskCode
|
|||||||
/* A delay time of zero just forces a reschedule. */
|
/* A delay time of zero just forces a reschedule. */
|
||||||
if( xTicksToDelay > ( TickType_t ) 0U )
|
if( xTicksToDelay > ( TickType_t ) 0U )
|
||||||
{
|
{
|
||||||
configASSERT( uxSchedulerSuspended[xPortGetCoreID()] == 0 );
|
configASSERT( xTaskGetSchedulerState() != taskSCHEDULER_SUSPENDED );
|
||||||
taskENTER_CRITICAL( &xTaskQueueMutex );
|
taskENTER_CRITICAL( &xTaskQueueMutex );
|
||||||
{
|
{
|
||||||
traceTASK_DELAY();
|
traceTASK_DELAY();
|
||||||
@@ -2434,9 +2434,9 @@ TCB_t *pxTCB = NULL;
|
|||||||
BaseType_t xAlreadyYielded = pdFALSE;
|
BaseType_t xAlreadyYielded = pdFALSE;
|
||||||
TickType_t xTicksToNextUnblockTime;
|
TickType_t xTicksToNextUnblockTime;
|
||||||
|
|
||||||
/* If uxSchedulerSuspended[xPortGetCoreID()] is zero then this function does not match a
|
/* If scheduler state is `taskSCHEDULER_RUNNING` then this function does not match a
|
||||||
previous call to taskENTER_CRITICAL( &xTaskQueueMutex ). */
|
previous call to taskENTER_CRITICAL( &xTaskQueueMutex ). */
|
||||||
configASSERT( uxSchedulerSuspended[xPortGetCoreID()] );
|
configASSERT( xTaskGetSchedulerState() != taskSCHEDULER_RUNNING );
|
||||||
|
|
||||||
/* It is possible that an ISR caused a task to be removed from an event
|
/* 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
|
list while the scheduler was suspended. If this was the case then the
|
||||||
@@ -2874,7 +2874,7 @@ BaseType_t xYieldRequired = pdFALSE;
|
|||||||
|
|
||||||
/* Must not be called with the scheduler suspended as the implementation
|
/* Must not be called with the scheduler suspended as the implementation
|
||||||
relies on xPendedTicks being wound down to 0 in xTaskResumeAll(). */
|
relies on xPendedTicks being wound down to 0 in xTaskResumeAll(). */
|
||||||
configASSERT( uxSchedulerSuspended[xPortGetCoreID()] == 0 );
|
configASSERT( xTaskGetSchedulerState() != taskSCHEDULER_SUSPENDED );
|
||||||
|
|
||||||
/* Use xPendedTicks to mimic xTicksToCatchUp number of ticks occuring when
|
/* Use xPendedTicks to mimic xTicksToCatchUp number of ticks occuring when
|
||||||
the scheduler is suspended so the ticks are executed in xTaskResumeAll(). */
|
the scheduler is suspended so the ticks are executed in xTaskResumeAll(). */
|
||||||
@@ -4511,7 +4511,9 @@ TCB_t *pxTCB;
|
|||||||
BaseType_t xTaskGetSchedulerState( void )
|
BaseType_t xTaskGetSchedulerState( void )
|
||||||
{
|
{
|
||||||
BaseType_t xReturn;
|
BaseType_t xReturn;
|
||||||
|
unsigned state;
|
||||||
|
|
||||||
|
state = portENTER_CRITICAL_NESTED();
|
||||||
if( xSchedulerRunning == pdFALSE )
|
if( xSchedulerRunning == pdFALSE )
|
||||||
{
|
{
|
||||||
xReturn = taskSCHEDULER_NOT_STARTED;
|
xReturn = taskSCHEDULER_NOT_STARTED;
|
||||||
@@ -4527,6 +4529,7 @@ TCB_t *pxTCB;
|
|||||||
xReturn = taskSCHEDULER_SUSPENDED;
|
xReturn = taskSCHEDULER_SUSPENDED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
portEXIT_CRITICAL_NESTED(state);
|
||||||
|
|
||||||
return xReturn;
|
return xReturn;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user