Przeglądaj źródła

Merge branch 'bugfix/scheduler_state_query_thread_safety' into 'master'

freertos: fix thread safety for checking scheduler state

Closes IDFGH-6041

See merge request espressif/esp-idf!16097
Mahavir Jain 4 lat temu
rodzic
commit
140efc3857
1 zmienionych plików z 8 dodań i 5 usunięć
  1. 8 5
      components/freertos/FreeRTOS-Kernel/tasks.c

+ 8 - 5
components/freertos/FreeRTOS-Kernel/tasks.c

@@ -1467,7 +1467,7 @@ static void prvAddNewTaskToReadyList( TCB_t * pxNewTCB,
 
         configASSERT( pxPreviousWakeTime );
         configASSERT( ( xTimeIncrement > 0U ) );
-        configASSERT( uxSchedulerSuspended[xPortGetCoreID()] == 0 );
+        configASSERT( xTaskGetSchedulerState() != taskSCHEDULER_SUSPENDED );
 
 #ifdef ESP_PLATFORM // IDF-3755
         taskENTER_CRITICAL();
@@ -1562,7 +1562,7 @@ static void prvAddNewTaskToReadyList( TCB_t * pxNewTCB,
         /* A delay time of zero just forces a reschedule. */
         if( xTicksToDelay > ( TickType_t ) 0U )
         {
-            configASSERT( uxSchedulerSuspended[xPortGetCoreID()] == 0 );
+            configASSERT( xTaskGetSchedulerState() != taskSCHEDULER_SUSPENDED );
 #ifdef ESP_PLATFORM // IDF-3755
             taskENTER_CRITICAL();
 #else
@@ -2506,9 +2506,9 @@ BaseType_t xTaskResumeAll( void )
     BaseType_t xAlreadyYielded = pdFALSE;
     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(). */
-    configASSERT( uxSchedulerSuspended[xPortGetCoreID()] );
+    configASSERT( xTaskGetSchedulerState() != taskSCHEDULER_RUNNING );
 
     /* 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
@@ -2967,7 +2967,7 @@ BaseType_t xTaskCatchUpTicks( TickType_t xTicksToCatchUp )
 
     /* Must not be called with the scheduler suspended as the implementation
      * 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
      * the scheduler is suspended so the ticks are executed in xTaskResumeAll(). */
@@ -4664,7 +4664,9 @@ static void prvResetNextTaskUnblockTime( void )
     BaseType_t xTaskGetSchedulerState( void )
     {
         BaseType_t xReturn;
+        unsigned state;
 
+        state = portSET_INTERRUPT_MASK_FROM_ISR();
         if( xSchedulerRunning == pdFALSE )
         {
             xReturn = taskSCHEDULER_NOT_STARTED;
@@ -4680,6 +4682,7 @@ static void prvResetNextTaskUnblockTime( void )
                 xReturn = taskSCHEDULER_SUSPENDED;
             }
         }
+        portCLEAR_INTERRUPT_MASK_FROM_ISR(state);
 
         return xReturn;
     }