int pthread_detach()

in FreeRTOS-Plus-POSIX/source/FreeRTOS_POSIX_pthread.c [478:533]


int pthread_detach(pthread_t pthread)
{
    int iStatus = 0;
    pthread_internal_t * pxThread = ( pthread_internal_t * ) pthread;
    eTaskState pThreadState;

    /* Make sure pthread is joinable. */
    if( !pthreadIS_JOINABLE( pxThread->xAttr.usSchedPriorityDetachState ) )
    {
        iStatus = EINVAL;
    }

    if ( iStatus == 0 )
    {
        /* Create a critical section to verify that pthread is joinable. */
        vTaskSuspendAll();

        pThreadState = eTaskGetState(pxThread->xTaskHandle);

        /* Thread has been deleted or is invalid. */
        if ( (pThreadState == eDeleted) || (pThreadState == eInvalid) )
        {
           iStatus = EINVAL;
        }
        else
        {
           /* Release xJoinBarrier and delete it. */
            ( void ) xSemaphoreGive( ( SemaphoreHandle_t ) &pxThread->xJoinBarrier );
            vSemaphoreDelete( ( SemaphoreHandle_t ) &pxThread->xJoinBarrier );

            /* Release xJoinMutex and delete it. */
            ( void ) xSemaphoreGive( ( SemaphoreHandle_t ) &pxThread->xJoinMutex );
            vSemaphoreDelete( ( SemaphoreHandle_t ) &pxThread->xJoinMutex );

            /* Thread has been finished */
            if ( pThreadState == eSuspended )
            {
               /* Delete the FreeRTOS task that ran the thread. */
               vTaskDelete( pxThread->xTaskHandle );

               /* Free the thread object. */
               vPortFree( pxThread );
            }
            else
            {
               /* Thread is in the running or ready state. */
               pthread_attr_setdetachstate( (pthread_attr_t *) &pxThread->xAttr, PTHREAD_CREATE_DETACHED );
            }
        }

        /* End the critical section. */
        xTaskResumeAll();
    }

    return iStatus;
}