mirror of
https://github.com/FreeRTOS/FreeRTOS-Kernel.git
synced 2025-07-26 22:22:32 -04:00
Delete thread key on process exit (#1297)
Previously, the shared thread key was deleted in xPortStartScheduler after scheduler was ended. This created a race condition where prvThreadKeyDestructor (responsible for freeing thread-specific heap memory) would not be called if xPortStartScheduler deleted the key before the last task deletion, as destructors are not invoked after key deletion (see https://github.com/walac/glibc/blob/master/nptl/pthread_create.c#L145-L150). Move thread key deletion to process exit to ensure all thread-specific memory is properly freed. Signed-off-by: Gaurav Aggarwal <aggarg@amazon.com>
This commit is contained in:
parent
684b34ca8d
commit
32e581636f
4
portable/ThirdParty/GCC/Posix/port.c
vendored
4
portable/ThirdParty/GCC/Posix/port.c
vendored
|
@ -140,6 +140,8 @@ static void prvThreadKeyDestructor( void * pvData )
|
||||||
static void prvInitThreadKey( void )
|
static void prvInitThreadKey( void )
|
||||||
{
|
{
|
||||||
pthread_key_create( &xThreadKey, prvThreadKeyDestructor );
|
pthread_key_create( &xThreadKey, prvThreadKeyDestructor );
|
||||||
|
/* Destroy xThreadKey when the process exits. */
|
||||||
|
atexit( prvDestroyThreadKey );
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
@ -315,8 +317,6 @@ BaseType_t xPortStartScheduler( void )
|
||||||
/* Restore original signal mask. */
|
/* Restore original signal mask. */
|
||||||
( void ) pthread_sigmask( SIG_SETMASK, &xSchedulerOriginalSignalMask, NULL );
|
( void ) pthread_sigmask( SIG_SETMASK, &xSchedulerOriginalSignalMask, NULL );
|
||||||
|
|
||||||
prvDestroyThreadKey();
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
Loading…
Reference in a new issue