/* 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; }
/* 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; }