Example #1
0
/** \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);
}
Example #2
0
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;
  }
}
Example #3
0
/** \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);
}