OSStatus
MD_CriticalRegionExit(MDCriticalRegionID inCriticalRegionID)
{
  MDCriticalRegionDataPtr   criticalRegion = (MDCriticalRegionDataPtr)inCriticalRegionID;
  MPTaskID                  currentTaskID = MPCurrentTaskID();
  OSStatus                  err = noErr;

  // if we don't own the critical region...
  if (currentTaskID != criticalRegion->mMPTaskID)
    return kMPInsufficientResourcesErr;

  // if we aren't at a depth...
  if (criticalRegion->mDepthCount == 0)
    return kMPInsufficientResourcesErr;

  // un-bump my depth
  criticalRegion->mDepthCount--;

  // if we just bottomed out...
  if (criticalRegion->mDepthCount == 0)
  {
    // release ownership of the structure
    criticalRegion->mMPTaskID = kInvalidID;
    // and signal the ready semaphore
    err = MPSignalSemaphore(criticalRegion->mMPSemaphoreID);
  }
  return err;
}
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;
}
Exemple #3
0
cFUThreadRef cFUThread::CurrentThreadID()
{
#if defined(WIN32)
	return ::GetCurrentThreadId();
#elif defined (FP_APPLE)
	return MPCurrentTaskID();
#elif defined(LINUX) || defined(IOS)|| defined(ANDROID)
	return pthread_self();
#endif
}
Exemple #4
0
thread::thread()
    : m_joinable(false)
{
#if defined(BOOST_HAS_WINTHREADS)
    m_thread = reinterpret_cast<void*>(GetCurrentThread());
    m_id = GetCurrentThreadId();
#elif defined(BOOST_HAS_PTHREADS)
    m_thread = pthread_self();
#elif defined(BOOST_HAS_MPTASKS)
    threads::mac::detail::thread_init();
    threads::mac::detail::create_singletons();
    m_pTaskID = MPCurrentTaskID();
    m_pJoinQueueID = kInvalidID;
#endif
}
Exemple #5
0
unsigned long wxThread::GetCurrentId()
{
    return (unsigned long)MPCurrentTaskID();
}