Пример #1
0
OSStatus
MD_CriticalRegionEnter(MDCriticalRegionID inCriticalRegionID, Duration inTimeout)
{
  MDCriticalRegionDataPtr criticalRegion = (MDCriticalRegionDataPtr)inCriticalRegionID;
  MPTaskID                currentTaskID = MPCurrentTaskID();
  OSStatus                err = noErr;

  if (criticalRegion == NULL)
    return paramErr;

  // if I'm inside the critical region...
  if (currentTaskID == criticalRegion->mMPTaskID)
  {
    // bump my depth
    criticalRegion->mDepthCount++;
    // and continue
    return noErr;
  }

  // wait for the ready semaphore
  err = MPWaitOnSemaphore(criticalRegion->mMPSemaphoreID, inTimeout);
  // we didn't get it. return the error
  if (noErr != err) return err;

  // we got it!
  criticalRegion->mMPTaskID = currentTaskID;
  criticalRegion->mDepthCount = 1;

  return noErr;
}
Пример #2
0
bool cFUSemaphore::Down(uint32 blockTime)
{
#if defined(WIN32)
	return WaitForSingleObject(semaphoreHandle, blockTime) == WAIT_OBJECT_0;
#elif defined(FP_APPLE)
	return MPWaitOnSemaphore(semaphoreHandle, (blockTime == (uint32)-1) ? kDurationForever : blockTime) == noErr;
#elif defined(LINUX) || defined(ANDROID) || defined(IOS)
	if (blockTime == (uint32) -1)
	{
		return sem_wait(&semaphoreHandle) == 0;
	}
	else
	{
#ifdef IOS
		//f**k because I am f*****g lazy to implement this so...
		return sem_wait(&semaphoreHandle) == 0;
#else

		// The basic POSIX semaphore does not support a block time, but rather a deadline.
		timespec deadline;
		
		clock_gettime(CLOCK_REALTIME, &deadline);
		
		deadline.tv_nsec += (blockTime * 1000);
		
		return sem_timedwait(&semaphoreHandle, &deadline) == 0;
#endif
	}
#endif
}
Пример #3
0
static
int buff_wait(struct buffer *buffer)
{
  if (MPWaitOnSemaphore(buffer->semaphore, kDurationForever) != noErr) {
    audio_error = _("MPWaitOnSemaphore() failed");
    return -1;
  }

  return 0;
}
Пример #4
0
wxMutexError wxMutexInternal::Lock()
{
    wxCHECK_MSG( m_isOk , wxMUTEX_MISC_ERROR , wxT("Invalid Mutex") ) ;
	OSStatus err = MPWaitOnSemaphore( m_semaphore, kDurationForever);
	if ( err)
    {
		wxLogSysError(wxT("Could not lock mutex"));
		return wxMUTEX_MISC_ERROR;
    }
    
	return wxMUTEX_NO_ERROR;
}
Пример #5
0
wxSemaError wxSemaphoreInternal::WaitTimeout( unsigned long milliseconds )
{
    OSStatus err = MPWaitOnSemaphore( m_semaphore, milliseconds );
    if (err != noErr)
    {
        if (err == kMPTimeoutErr)
            return wxSEMA_TIMEOUT;

        return wxSEMA_MISC_ERROR;
    }

    return wxSEMA_NO_ERROR;
}
Пример #6
0
wxMutexError wxMutexInternal::TryLock()
{
    wxCHECK_MSG( m_isOk, wxMUTEX_MISC_ERROR, wxT("Invalid Mutex") );
    OSStatus err = MPWaitOnSemaphore( m_semaphore, kDurationImmediate );
    if (err != noErr)
    {
        if (err == kMPTimeoutErr)
            return wxMUTEX_BUSY;

        wxLogSysError( wxT("Could not try lock mutex") );

        return wxMUTEX_MISC_ERROR;
    }

    return wxMUTEX_NO_ERROR;
}
Пример #7
0
bool hsGlobalSemaphore::Wait(hsMilliseconds timeToWait)
{
    Duration    duration;

    if (timeToWait == kPosInfinity32)
        duration = kDurationForever;
    else
        duration = 0;   // THEY DON'T IMPLEMENT delay times yet !!!

    OSStatus    status = MPWaitOnSemaphore(fSemaId, duration);
/*
    if (status == kMPTimeoutErr)
        return false;
*/
    hsThrowIfOSErr(status);
    return true;
}