mirror of
				https://github.com/FreeRTOS/FreeRTOS-Kernel.git
				synced 2025-11-04 02:59:01 +01:00 
			
		
		
		
	Fix race in POSIX port vPortEndScheduler (#1262)
				
					
				
			* Fix race in POSIX port `vPortEndScheduler` The `vPortEndScheduler` checks whether it's a FreeRTOS thread after signalling the scheduler thread to stop. This creates a race between the check and the destruction of the thread key. By moving the signal to the scheduler thread after the check, the race is prevented. * Code review suggestions Signed-off-by: Gaurav Aggarwal <aggarg@amazon.com> --------- Signed-off-by: Gaurav Aggarwal <aggarg@amazon.com> Co-authored-by: Gaurav Aggarwal <aggarg@amazon.com>
This commit is contained in:
		
							parent
							
								
									0030d609a4
								
							
						
					
					
						commit
						03db672b8f
					
				
							
								
								
									
										8
									
								
								portable/ThirdParty/GCC/Posix/port.c
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								portable/ThirdParty/GCC/Posix/port.c
									
									
									
									
										vendored
									
									
								
							@ -324,17 +324,23 @@ BaseType_t xPortStartScheduler( void )
 | 
				
			|||||||
void vPortEndScheduler( void )
 | 
					void vPortEndScheduler( void )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    Thread_t * pxCurrentThread;
 | 
					    Thread_t * pxCurrentThread;
 | 
				
			||||||
 | 
					    BaseType_t xIsFreeRTOSThread;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* Stop the timer tick thread. */
 | 
					    /* Stop the timer tick thread. */
 | 
				
			||||||
    xTimerTickThreadShouldRun = false;
 | 
					    xTimerTickThreadShouldRun = false;
 | 
				
			||||||
    pthread_join( hTimerTickThread, NULL );
 | 
					    pthread_join( hTimerTickThread, NULL );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Check whether the current thread is a FreeRTOS thread.
 | 
				
			||||||
 | 
					     * This has to happen before the scheduler is signaled to exit
 | 
				
			||||||
 | 
					     * its loop to prevent data races on the thread key. */
 | 
				
			||||||
 | 
					    xIsFreeRTOSThread = prvIsFreeRTOSThread();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* Signal the scheduler to exit its loop. */
 | 
					    /* Signal the scheduler to exit its loop. */
 | 
				
			||||||
    xSchedulerEnd = pdTRUE;
 | 
					    xSchedulerEnd = pdTRUE;
 | 
				
			||||||
    ( void ) pthread_kill( hMainThread, SIG_RESUME );
 | 
					    ( void ) pthread_kill( hMainThread, SIG_RESUME );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* Waiting to be deleted here. */
 | 
					    /* Waiting to be deleted here. */
 | 
				
			||||||
    if( prvIsFreeRTOSThread() == pdTRUE )
 | 
					    if( xIsFreeRTOSThread == pdTRUE )
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        pxCurrentThread = prvGetThreadFromTask( xTaskGetCurrentTaskHandle() );
 | 
					        pxCurrentThread = prvGetThreadFromTask( xTaskGetCurrentTaskHandle() );
 | 
				
			||||||
        event_wait( pxCurrentThread->ev );
 | 
					        event_wait( pxCurrentThread->ev );
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user