forked from epagris/FreeRTOS-Kernel
		
	Update unpaired critical section in vTaskDelete for readability (#958)
* Modify unpaired critical section for readability * Move prvDeleteTCB out of critical section for SMP --------- Signed-off-by: Gaurav Aggarwal <aggarg@amazon.com> Co-authored-by: Gaurav Aggarwal <aggarg@amazon.com>
This commit is contained in:
		
							parent
							
								
									e6f6d0ecf4
								
							
						
					
					
						commit
						cf2366c949
					
				
							
								
								
									
										73
									
								
								tasks.c
									
									
									
									
									
								
							
							
						
						
									
										73
									
								
								tasks.c
									
									
									
									
									
								
							@ -2190,6 +2190,7 @@ static void prvInitialiseNewTask( TaskFunction_t pxTaskCode,
 | 
			
		||||
    void vTaskDelete( TaskHandle_t xTaskToDelete )
 | 
			
		||||
    {
 | 
			
		||||
        TCB_t * pxTCB;
 | 
			
		||||
        BaseType_t xDeleteTCBInIdleTask = pdFALSE;
 | 
			
		||||
 | 
			
		||||
        traceENTER_vTaskDelete( xTaskToDelete );
 | 
			
		||||
 | 
			
		||||
@ -2247,6 +2248,9 @@ static void prvInitialiseNewTask( TaskFunction_t pxTaskCode,
 | 
			
		||||
                 * portPRE_TASK_DELETE_HOOK() does not return in the Win32 port. */
 | 
			
		||||
                traceTASK_DELETE( pxTCB );
 | 
			
		||||
 | 
			
		||||
                /* Delete the task TCB in idle task. */
 | 
			
		||||
                xDeleteTCBInIdleTask = pdTRUE;
 | 
			
		||||
 | 
			
		||||
                /* The pre-delete hook is primarily for the Windows simulator,
 | 
			
		||||
                 * in which Windows specific clean up operations are performed,
 | 
			
		||||
                 * after which it is not possible to yield away from this task -
 | 
			
		||||
@ -2268,61 +2272,56 @@ static void prvInitialiseNewTask( TaskFunction_t pxTaskCode,
 | 
			
		||||
                prvResetNextTaskUnblockTime();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        taskEXIT_CRITICAL();
 | 
			
		||||
 | 
			
		||||
        #if ( configNUMBER_OF_CORES == 1 )
 | 
			
		||||
        /* If the task is not deleting itself, call prvDeleteTCB from outside of
 | 
			
		||||
         * critical section. If a task deletes itself, prvDeleteTCB is called
 | 
			
		||||
         * from prvCheckTasksWaitingTermination which is called from Idle task. */
 | 
			
		||||
        if( xDeleteTCBInIdleTask != pdTRUE )
 | 
			
		||||
        {
 | 
			
		||||
            taskEXIT_CRITICAL();
 | 
			
		||||
            prvDeleteTCB( pxTCB );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
            /* If the task is not deleting itself, call prvDeleteTCB from outside of
 | 
			
		||||
             * critical section. If a task deletes itself, prvDeleteTCB is called
 | 
			
		||||
             * from prvCheckTasksWaitingTermination which is called from Idle task. */
 | 
			
		||||
            if( pxTCB != pxCurrentTCB )
 | 
			
		||||
            {
 | 
			
		||||
                prvDeleteTCB( pxTCB );
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            /* Force a reschedule if it is the currently running task that has just
 | 
			
		||||
             * been deleted. */
 | 
			
		||||
            if( xSchedulerRunning != pdFALSE )
 | 
			
		||||
        /* Force a reschedule if it is the currently running task that has just
 | 
			
		||||
         * been deleted. */
 | 
			
		||||
        if( xSchedulerRunning != pdFALSE )
 | 
			
		||||
        {
 | 
			
		||||
            #if ( configNUMBER_OF_CORES == 1 )
 | 
			
		||||
            {
 | 
			
		||||
                if( pxTCB == pxCurrentTCB )
 | 
			
		||||
                {
 | 
			
		||||
                    configASSERT( uxSchedulerSuspended == 0 );
 | 
			
		||||
                    portYIELD_WITHIN_API();
 | 
			
		||||
                    taskYIELD_WITHIN_API();
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    mtCOVERAGE_TEST_MARKER();
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        #else /* #if ( configNUMBER_OF_CORES == 1 ) */
 | 
			
		||||
        {
 | 
			
		||||
            /* If a running task is not deleting itself, call prvDeleteTCB. If a running
 | 
			
		||||
             * task deletes itself, prvDeleteTCB is called from prvCheckTasksWaitingTermination
 | 
			
		||||
             * which is called from Idle task. */
 | 
			
		||||
            if( pxTCB->xTaskRunState == taskTASK_NOT_RUNNING )
 | 
			
		||||
            #else /* #if ( configNUMBER_OF_CORES == 1 ) */
 | 
			
		||||
            {
 | 
			
		||||
                prvDeleteTCB( pxTCB );
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            /* Force a reschedule if the task that has just been deleted was running. */
 | 
			
		||||
            if( ( xSchedulerRunning != pdFALSE ) && ( taskTASK_IS_RUNNING( pxTCB ) == pdTRUE ) )
 | 
			
		||||
            {
 | 
			
		||||
                if( pxTCB->xTaskRunState == ( BaseType_t ) portGET_CORE_ID() )
 | 
			
		||||
                /* It is important to use critical section here because
 | 
			
		||||
                 * checking run state of a task must be done inside a
 | 
			
		||||
                 * critical section. */
 | 
			
		||||
                taskENTER_CRITICAL();
 | 
			
		||||
                {
 | 
			
		||||
                    configASSERT( uxSchedulerSuspended == 0 );
 | 
			
		||||
                    vTaskYieldWithinAPI();
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    prvYieldCore( pxTCB->xTaskRunState );
 | 
			
		||||
                    if( taskTASK_IS_RUNNING( pxTCB ) == pdTRUE )
 | 
			
		||||
                    {
 | 
			
		||||
                        if( pxTCB->xTaskRunState == ( BaseType_t ) portGET_CORE_ID() )
 | 
			
		||||
                        {
 | 
			
		||||
                            configASSERT( uxSchedulerSuspended == 0 );
 | 
			
		||||
                            taskYIELD_WITHIN_API();
 | 
			
		||||
                        }
 | 
			
		||||
                        else
 | 
			
		||||
                        {
 | 
			
		||||
                            prvYieldCore( pxTCB->xTaskRunState );
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                taskEXIT_CRITICAL();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            taskEXIT_CRITICAL();
 | 
			
		||||
            #endif /* #if ( configNUMBER_OF_CORES == 1 ) */
 | 
			
		||||
        }
 | 
			
		||||
        #endif /* #if ( configNUMBER_OF_CORES == 1 ) */
 | 
			
		||||
 | 
			
		||||
        traceRETURN_vTaskDelete();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user