예제 #1
0
/* Wait
 *  waits for a thread to exit
 *
 *  "status" [ OUT ] - return parameter for thread's exit code
 */
LIB_EXPORT rc_t CC KThreadWait ( KThread *self, rc_t *out )
{
    DWORD wait_res;

    if ( self == NULL )
        return RC ( rcPS, rcThread, rcWaiting, rcSelf, rcNull );

    /* prevent multiple waiters */
    if ( atomic32_test_and_set ( & self -> waiting, 0, 1 ) != 0 )
        return RC ( rcPS, rcThread, rcWaiting, rcThread, rcBusy );

    wait_res = WaitForSingleObject( self->thread_handle, INFINITE );

    /* release waiter lock */
    atomic32_set ( & self -> waiting, 0 );

    switch( wait_res )
    {
    case WAIT_FAILED :
        return RC ( rcPS, rcThread, rcWaiting, rcNoObj, rcUnknown );
    }
    /*
        switch ( status )
        {
        case 0:
            break;
        case ESRCH:
            return RC ( rcPS, rcThread, rcWaiting, rcThread, rcDestroyed );
        case EINVAL:
            return RC ( rcPS, rcThread, rcWaiting, rcThread, rcDetached );
        case EDEADLK:
            return RC ( rcPS, rcThread, rcWaiting, rcThread, rcDeadlock );
        default:
            return RC ( rcPS, rcThread, rcWaiting, rcNoObj, rcUnknown );
        }
    */

    self -> join = false;

    /*
        if ( td == PTHREAD_CANCELED )
            self -> rc = RC ( rcPS, rcThread, rcWaiting, rcThread, rcCanceled );
    */
    if ( out != NULL )
        * out = self -> rc;

    return 0;
}
예제 #2
0
파일: queue.c 프로젝트: ncbi/ncbi-vdb
/* Seal
 *  indicate that the queue has been closed off
 *  meaning there will be no further push operations
 *  if "writes" is true, and no further pop operations
 *  otherwise.
 */
LIB_EXPORT rc_t CC KQueueSeal ( KQueue *self )
{
    rc_t rc = 0;

    QMSG ( "%s[%p] called\n", __func__, self );

    if ( self == NULL )
        return RC ( rcCont, rcQueue, rcFreezing, rcSelf, rcNull );

    if ( atomic32_test_and_set ( & self -> sealed, 1, 0 ) == 0 )
    {
#if 1
        QMSG ( "%s[%p]: acquiring write lock ( %p )\n", __func__, self, self -> wl );
        rc = KLockAcquire ( self -> wl );
        if ( rc == 0 )
        {
            QMSG ( "%s[%p]: canceling write semaphore...\n", __func__, self );
            rc = KSemaphoreCancel ( self -> wc );
            QMSG ( "%s[%p]: ...done, rc = %R.\n", __func__, self, rc );
            KLockUnlock ( self -> wl );

            if ( rc == 0 )
            {
                QMSG ( "%s[%p]: acquiring read lock ( %p )\n", __func__, self, self -> rl );
                rc = KLockAcquire ( self -> rl );
                if ( rc == 0 )
                {
                    QMSG ( "%s[%p]: canceling read semaphore...\n", __func__, self );
                    rc = KSemaphoreCancel ( self -> rc );
                    QMSG ( "%s[%p]: ...done, rc = %R.\n", __func__, self, rc );
                    KLockUnlock ( self -> rl );
                }
            }
        }
#endif
    }

    return rc;
}