mirror of
				https://github.com/espressif/esp-idf.git
				synced 2025-11-04 00:51:42 +01:00 
			
		
		
		
	freertos-idf: Fixed incorrect scheduler suspension check in xTaskRemoveFromEventList()
This commit fixes a bug in xTaskRemoveFromEvenetList() where in the check for scheduler suspension did not account for nested suspensions. Additionally, this commit updates all checks for scheduler suspension to follow a uniform way.
This commit is contained in:
		@@ -280,11 +280,11 @@
 | 
			
		||||
 *      - Check the scheduler suspension state on core 0. The task can be scheduled if the scheduler is not suspended.
 | 
			
		||||
 */
 | 
			
		||||
#if ( configNUM_CORES > 1 )
 | 
			
		||||
    #define taskCAN_BE_SCHEDULED( pxTCB )                                                                              \
 | 
			
		||||
    ( ( pxTCB->xCoreID != tskNO_AFFINITY ) ) ? ( uxSchedulerSuspended[ pxTCB->xCoreID ] == ( UBaseType_t ) pdFALSE ) : \
 | 
			
		||||
    ( ( uxSchedulerSuspended[ 0 ] == ( UBaseType_t ) pdFALSE ) || ( uxSchedulerSuspended[ 1 ] == ( UBaseType_t ) pdFALSE ) )
 | 
			
		||||
    #define taskCAN_BE_SCHEDULED( pxTCB )                                                                           \
 | 
			
		||||
    ( ( pxTCB->xCoreID != tskNO_AFFINITY ) ) ? ( uxSchedulerSuspended[ pxTCB->xCoreID ] == ( UBaseType_t ) 0U ) :   \
 | 
			
		||||
    ( ( uxSchedulerSuspended[ 0 ] == ( UBaseType_t ) 0U ) || ( uxSchedulerSuspended[ 1 ] == ( UBaseType_t ) 0U ) )
 | 
			
		||||
#else
 | 
			
		||||
    #define taskCAN_BE_SCHEDULED( pxTCB )    ( ( uxSchedulerSuspended[ 0 ] == ( UBaseType_t ) pdFALSE ) )
 | 
			
		||||
    #define taskCAN_BE_SCHEDULED( pxTCB )    ( ( uxSchedulerSuspended[ 0 ] == ( UBaseType_t ) 0U ) )
 | 
			
		||||
#endif /* configNUM_CORES > 1 */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
@@ -318,7 +318,7 @@
 | 
			
		||||
#if ( configNUM_CORES > 1 )
 | 
			
		||||
    #define taskIS_SCHEDULER_SUSPENDED()    ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED )
 | 
			
		||||
#else
 | 
			
		||||
    #define taskIS_SCHEDULER_SUSPENDED()    ( uxSchedulerSuspended[ 0 ] > 0 )
 | 
			
		||||
    #define taskIS_SCHEDULER_SUSPENDED()    ( ( uxSchedulerSuspended[ 0 ] != ( UBaseType_t ) 0U ) )
 | 
			
		||||
#endif /* configNUM_CORES > 1 */
 | 
			
		||||
 | 
			
		||||
/* The item value of the event list item is normally used to hold the priority
 | 
			
		||||
@@ -485,7 +485,7 @@ PRIVILEGED_DATA static TaskHandle_t xIdleTaskHandle[ configNUM_CORES ] = { NULL
 | 
			
		||||
 * kernel to move the task from the pending ready list into the real ready list
 | 
			
		||||
 * when the scheduler is unsuspended.  The pending ready list itself can only be
 | 
			
		||||
 * accessed from a critical section. */
 | 
			
		||||
PRIVILEGED_DATA static volatile UBaseType_t uxSchedulerSuspended[ configNUM_CORES ] = { ( UBaseType_t ) pdFALSE };
 | 
			
		||||
PRIVILEGED_DATA static volatile UBaseType_t uxSchedulerSuspended[ configNUM_CORES ] = { ( UBaseType_t ) 0U };
 | 
			
		||||
 | 
			
		||||
#if ( configGENERATE_RUN_TIME_STATS == 1 )
 | 
			
		||||
 | 
			
		||||
@@ -1384,7 +1384,7 @@ static void prvAddNewTaskToReadyList( TCB_t * pxNewTCB )
 | 
			
		||||
        /* If the target task can run on the current core, and has a higher priority than the current core, and the core has not suspended scheduling, then yield the current core */
 | 
			
		||||
        if( ( ( xTaskCoreID == xCurCoreID ) || ( xTaskCoreID == tskNO_AFFINITY ) ) &&
 | 
			
		||||
            ( uxTaskPriority > pxCurrentTCB[ xCurCoreID ]->uxPriority ) &&
 | 
			
		||||
            ( uxSchedulerSuspended[ xCurCoreID ] == ( UBaseType_t ) pdFALSE ) )
 | 
			
		||||
            ( uxSchedulerSuspended[ xCurCoreID ] == ( UBaseType_t ) 0U ) )
 | 
			
		||||
        {
 | 
			
		||||
            /* Return true for the caller to yield the current core */
 | 
			
		||||
            xYieldRequiredCurrentCore = pdTRUE;
 | 
			
		||||
@@ -1392,7 +1392,7 @@ static void prvAddNewTaskToReadyList( TCB_t * pxNewTCB )
 | 
			
		||||
        /* If the target task can run on the other core, and has a higher priority then the other core, and the other core has not suspended scheduling, then yield the other core */
 | 
			
		||||
        else if( ( ( xTaskCoreID == !xCurCoreID ) || ( xTaskCoreID == tskNO_AFFINITY ) ) &&
 | 
			
		||||
                 ( uxTaskPriority > pxCurrentTCB[ !xCurCoreID ]->uxPriority ) &&
 | 
			
		||||
                 ( uxSchedulerSuspended[ !xCurCoreID ] == ( UBaseType_t ) pdFALSE ) )
 | 
			
		||||
                 ( uxSchedulerSuspended[ !xCurCoreID ] == ( UBaseType_t ) 0U ) )
 | 
			
		||||
        {
 | 
			
		||||
            /* Signal the other core to yield */
 | 
			
		||||
            vPortYieldOtherCore( !xCurCoreID );
 | 
			
		||||
@@ -1529,7 +1529,7 @@ static void prvAddNewTaskToReadyList( TCB_t * pxNewTCB )
 | 
			
		||||
 | 
			
		||||
            if( taskIS_CURRENTLY_RUNNING_ON_CORE( pxTCB, xPortGetCoreID() ) )
 | 
			
		||||
            {
 | 
			
		||||
                configASSERT( uxSchedulerSuspended[ xPortGetCoreID() ] == 0 );
 | 
			
		||||
                configASSERT( uxSchedulerSuspended[ xPortGetCoreID() ] == ( UBaseType_t ) 0U );
 | 
			
		||||
                portYIELD_WITHIN_API();
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
@@ -2089,7 +2089,7 @@ static void prvAddNewTaskToReadyList( TCB_t * pxNewTCB )
 | 
			
		||||
                if( xSchedulerRunning != pdFALSE )
 | 
			
		||||
                {
 | 
			
		||||
                    /* The current task has just been suspended. */
 | 
			
		||||
                    configASSERT( uxSchedulerSuspended[ xPortGetCoreID() ] == 0 );
 | 
			
		||||
                    configASSERT( uxSchedulerSuspended[ xPortGetCoreID() ] == ( UBaseType_t ) 0U );
 | 
			
		||||
                    portYIELD_WITHIN_API();
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
@@ -2594,7 +2594,7 @@ BaseType_t xTaskResumeAll( void )
 | 
			
		||||
 | 
			
		||||
        --uxSchedulerSuspended[ xCoreID ];
 | 
			
		||||
 | 
			
		||||
        if( uxSchedulerSuspended[ xCoreID ] == ( UBaseType_t ) pdFALSE )
 | 
			
		||||
        if( uxSchedulerSuspended[ xCoreID ] == ( UBaseType_t ) 0U )
 | 
			
		||||
        {
 | 
			
		||||
            if( uxCurrentNumberOfTasks > ( UBaseType_t ) 0U )
 | 
			
		||||
            {
 | 
			
		||||
@@ -3156,7 +3156,7 @@ BaseType_t xTaskIncrementTick( void )
 | 
			
		||||
        taskENTER_CRITICAL_ISR( &xKernelLock );
 | 
			
		||||
    #endif /* ( configNUM_CORES > 1 ) */
 | 
			
		||||
 | 
			
		||||
    if( uxSchedulerSuspended[ 0 ] == ( UBaseType_t ) pdFALSE )
 | 
			
		||||
    if( uxSchedulerSuspended[ 0 ] == ( UBaseType_t ) 0U )
 | 
			
		||||
    {
 | 
			
		||||
        /* Minor optimisation.  The tick count cannot change in this
 | 
			
		||||
         * block. */
 | 
			
		||||
@@ -3354,7 +3354,7 @@ BaseType_t xTaskIncrementTick( void )
 | 
			
		||||
         * tasks to be unblocked. */
 | 
			
		||||
        traceTASK_INCREMENT_TICK( xTickCount );
 | 
			
		||||
 | 
			
		||||
        if( uxSchedulerSuspended[ xCoreID ] == ( UBaseType_t ) pdFALSE )
 | 
			
		||||
        if( uxSchedulerSuspended[ xCoreID ] == ( UBaseType_t ) 0U )
 | 
			
		||||
        {
 | 
			
		||||
            /* We need take the kernel lock here as we are about to access
 | 
			
		||||
             * kernel data structures. */
 | 
			
		||||
@@ -3634,7 +3634,7 @@ void vTaskSwitchContext( void )
 | 
			
		||||
        taskENTER_CRITICAL_ISR( &xKernelLock );
 | 
			
		||||
    #endif /* ( configNUM_CORES > 1 ) */
 | 
			
		||||
 | 
			
		||||
    if( uxSchedulerSuspended[ xPortGetCoreID() ] != ( UBaseType_t ) pdFALSE )
 | 
			
		||||
    if( uxSchedulerSuspended[ xPortGetCoreID() ] != ( UBaseType_t ) 0U )
 | 
			
		||||
    {
 | 
			
		||||
        /* The scheduler is currently suspended - do not allow a context
 | 
			
		||||
         * switch. */
 | 
			
		||||
@@ -3776,7 +3776,7 @@ void vTaskPlaceOnUnorderedEventList( List_t * pxEventList,
 | 
			
		||||
 | 
			
		||||
        /* THIS FUNCTION MUST BE CALLED WITH THE SCHEDULER SUSPENDED.  It is used by
 | 
			
		||||
         * the event groups implementation. */
 | 
			
		||||
        configASSERT( uxSchedulerSuspended[ 0 ] != 0 );
 | 
			
		||||
        configASSERT( uxSchedulerSuspended[ 0 ] != ( UBaseType_t ) 0U );
 | 
			
		||||
    #endif /* configNUM_CORES > 1 */
 | 
			
		||||
 | 
			
		||||
    /* Store the item value in the event list item.  It is safe to access the
 | 
			
		||||
@@ -3930,7 +3930,7 @@ BaseType_t xTaskRemoveFromEventList( const List_t * const pxEventList )
 | 
			
		||||
                #else
 | 
			
		||||
                    xPendingListCore = 0;
 | 
			
		||||
                #endif /* configNUM_CORES > 1 */
 | 
			
		||||
                configASSERT( uxSchedulerSuspended[ xPendingListCore ] == pdTRUE );
 | 
			
		||||
                configASSERT( uxSchedulerSuspended[ xPendingListCore ] != ( UBaseType_t ) 0U );
 | 
			
		||||
 | 
			
		||||
                /* The delayed and ready lists cannot be accessed, so hold this task
 | 
			
		||||
                 * pending until the scheduler is resumed. */
 | 
			
		||||
@@ -4005,7 +4005,7 @@ void vTaskRemoveFromUnorderedEventList( ListItem_t * pxEventListItem,
 | 
			
		||||
 | 
			
		||||
        /* THIS FUNCTION MUST BE CALLED WITH THE SCHEDULER SUSPENDED.  It is used by
 | 
			
		||||
         * the event flags implementation. */
 | 
			
		||||
        configASSERT( uxSchedulerSuspended[ 0 ] != pdFALSE );
 | 
			
		||||
        configASSERT( uxSchedulerSuspended[ 0 ] != ( UBaseType_t ) 0U );
 | 
			
		||||
    #endif /* configNUM_CORES > 1 */
 | 
			
		||||
 | 
			
		||||
    /* Store the new item value in the event list. */
 | 
			
		||||
@@ -5003,7 +5003,7 @@ static void prvResetNextTaskUnblockTime( void )
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            if( uxSchedulerSuspended[ xPortGetCoreID() ] == ( UBaseType_t ) pdFALSE )
 | 
			
		||||
            if( uxSchedulerSuspended[ xPortGetCoreID() ] == ( UBaseType_t ) 0U )
 | 
			
		||||
            {
 | 
			
		||||
                xReturn = taskSCHEDULER_RUNNING;
 | 
			
		||||
            }
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user