diff --git a/FreeRTOS-Plus-POSIX/source/FreeRTOS_POSIX_pthread.c b/FreeRTOS-Plus-POSIX/source/FreeRTOS_POSIX_pthread.c old mode 100755 new mode 100644 index f34e9ec..9000336 --- a/FreeRTOS-Plus-POSIX/source/FreeRTOS_POSIX_pthread.c +++ b/FreeRTOS-Plus-POSIX/source/FreeRTOS_POSIX_pthread.c @@ -473,6 +473,38 @@ int pthread_join( pthread_t pthread, return iStatus; } +/*-----------------------------------------------------------*/ +int pthread_cancel( pthread_t pthread ) +{ + int iStatus = 0; + pthread_internal_t * pxThread = ( pthread_internal_t * ) pthread; + + /* Threads may already be successfully ended elsewhere and pending full deletion in idle task. */ + /* Note the the xJoinBarrier is a binary sem, so no new queue items are made once its already given */ + if( pxThread && pxThread->xTaskHandle && ( eDeleted != eTaskGetState( pxThread->xTaskHandle ) ) ) + { + if( pxThread == pthread_self() ) + { + prvExitThread(); + } + else + { + if( pthreadIS_JOINABLE( pxThread->xAttr.usSchedPriorityDetachState ) ) + { + xSemaphoreGive( ( SemaphoreHandle_t ) &pxThread->xJoinBarrier ); + vTaskSuspend( pxThread->xTaskHandle ); + } + else + { + vTaskDelete( pxThread->xTaskHandle ); + vPortFree( pxThread ); + } + } + } + + return iStatus; +} + /*-----------------------------------------------------------*/ pthread_t pthread_self( void ) diff --git a/include/FreeRTOS_POSIX/pthread.h b/include/FreeRTOS_POSIX/pthread.h old mode 100755 new mode 100644 index 77f949a..0e1a0eb --- a/include/FreeRTOS_POSIX/pthread.h +++ b/include/FreeRTOS_POSIX/pthread.h @@ -233,6 +233,15 @@ int pthread_barrier_init( pthread_barrier_t * barrier, */ int pthread_barrier_wait( pthread_barrier_t * barrier ); +/** + * @brief Request cancellation of thread. + * + * @see https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_cancel.html + * + * @retval 0 - Upon successful completion. + */ +int pthread_cancel( pthread_t thread ); + /** * @brief Thread creation. *