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; }
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 }
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 }
unsigned long wxThread::GetCurrentId() { return (unsigned long)MPCurrentTaskID(); }