From 436f256805dad9e0eeeeae886515fc2fec6ccf49 Mon Sep 17 00:00:00 2001 From: wangfei_chen Date: Thu, 3 Apr 2025 17:12:58 +0800 Subject: [PATCH 1/2] Fix detach race condition pxThread->xAttr.usSchedPriorityDetachState may be changed by pthread_detach(). Suspend scheduler to prevent race condition. Signed-off-by: wangfei_chen --- FreeRTOS-Plus-POSIX/source/FreeRTOS_POSIX_pthread.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/FreeRTOS-Plus-POSIX/source/FreeRTOS_POSIX_pthread.c b/FreeRTOS-Plus-POSIX/source/FreeRTOS_POSIX_pthread.c index f063160..a905f11 100755 --- a/FreeRTOS-Plus-POSIX/source/FreeRTOS_POSIX_pthread.c +++ b/FreeRTOS-Plus-POSIX/source/FreeRTOS_POSIX_pthread.c @@ -101,10 +101,12 @@ static void prvExitThread( void ) { pthread_internal_t * pxThread = ( pthread_internal_t * ) pthread_self(); + vTaskSuspendAll(); /* If this thread is joinable, wait for a call to pthread_join. */ if( pthreadIS_JOINABLE( pxThread->xAttr.usSchedPriorityDetachState ) ) { ( void ) xSemaphoreGive( ( SemaphoreHandle_t ) &pxThread->xJoinBarrier ); + ( void ) xTaskResumeAll(); /* Suspend until the call to pthread_join. The caller of pthread_join * will perform cleanup. */ @@ -112,6 +114,7 @@ static void prvExitThread( void ) } else { + ( void ) xTaskResumeAll(); /* For a detached thread, perform cleanup of thread object. */ vPortFree( pxThread ); vTaskDelete( NULL ); From aedef7509889d9732eed47ce5d7d551a04b17162 Mon Sep 17 00:00:00 2001 From: Rahul Kar Date: Thu, 3 Apr 2025 17:37:57 +0000 Subject: [PATCH 2/2] Fix compiler warnings --- FreeRTOS-Plus-POSIX/source/FreeRTOS_POSIX_pthread.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/FreeRTOS-Plus-POSIX/source/FreeRTOS_POSIX_pthread.c b/FreeRTOS-Plus-POSIX/source/FreeRTOS_POSIX_pthread.c index a905f11..2dadfe4 100755 --- a/FreeRTOS-Plus-POSIX/source/FreeRTOS_POSIX_pthread.c +++ b/FreeRTOS-Plus-POSIX/source/FreeRTOS_POSIX_pthread.c @@ -102,6 +102,7 @@ static void prvExitThread( void ) pthread_internal_t * pxThread = ( pthread_internal_t * ) pthread_self(); vTaskSuspendAll(); + /* If this thread is joinable, wait for a call to pthread_join. */ if( pthreadIS_JOINABLE( pxThread->xAttr.usSchedPriorityDetachState ) ) { @@ -362,7 +363,7 @@ int pthread_create( pthread_t * thread, } /* End the critical section. */ - xTaskResumeAll(); + ( void ) xTaskResumeAll(); } return iStatus; @@ -470,7 +471,7 @@ int pthread_join( pthread_t pthread, vPortFree( pxThread ); /* End the critical section. */ - xTaskResumeAll(); + ( void ) xTaskResumeAll(); } return iStatus; @@ -529,7 +530,7 @@ int pthread_detach(pthread_t pthread) } /* End the critical section. */ - xTaskResumeAll(); + ( void ) xTaskResumeAll(); } return iStatus;