/** \brief Acquire the mutex * */ os_result os_mutexLock_s (os_mutex *mutex) { Error err; Semaphore semaphore; SignedValue svalue; semaphore = os_os_mutexGetSem(mutex); err = WaitForSemaphore(semaphore); assert (err != ActivityIsAlreadyInUse); if ( err == Success ) { err = GetSemaphoreValue(semaphore, &svalue); assert( err == Success ); if ( svalue > 1 ) { /* This is not a recursive mutex */ err = ReleaseSemaphore(semaphore); assert( err == Success ); err = Failure; } } return (err == Success ? os_resultSuccess : os_resultFail); }
void Flush_Threaded() { if (jobs_start == -1) { // single-threaded SignatureFlush(); return; } else { int jobs_ready = 1; while (jobs_ready > 0) { GetSemaphoreValue(&sem_jobs_ready, &jobs_ready); ThreadYield(); } if (jobs_start != -1) { finishup = 1; for (int i = 0; i < threadpool_size; i++) { PostSemaphore(&sem_jobs_ready); } for (int i = 0; i < threadpool_size; i++) { pthread_join(threadpool[i], NULL); } SignatureFlush(); } return; } }
/** \brief Try to acquire the mutex, immediately return if the mutex * is already acquired by another thread */ os_result os_mutexTryLock (os_mutex *mutex) { Error err; Semaphore semaphore; os_result rv; semaphore = os_os_mutexGetSem(mutex); err = TryToObtainSemaphore(semaphore); switch (err ) { case Success: { SignedValue svalue; err = GetSemaphoreValue(semaphore, &svalue); assert( err == Success ); if ( svalue > 1 ) { /* This is not a recursive mutex */ err = ReleaseSemaphore(semaphore); rv = os_resultBusy; } else { rv = os_resultSuccess; } break; } case ResourceNotAvailable: { rv = os_resultBusy; break; } default: { abort (); rv = os_resultFail; } } return (rv); }