static OSStatus SFCLooker(void *parameter) { #pragma unused(parameter) OSStatus err; OSStatus junk; err = OTMPXPrepareThisTask(); if (err == noErr) { while ( ! gQuitLooker ) { if ( gLookerEP != NULL ) { (void) OTAtomicAdd32(1, &gLookCounter); junk = OTMPXLook(gLookerEP); if (1) { AbsoluteTime timeToWakeUp; timeToWakeUp = AddDurationToAbsolute(-64, UpTime()); junk = MPDelayUntil(&timeToWakeUp); assert(junk == noErr); // MPLogPrintfSlow("<look>"); } } } } OTMPXUnprepareThisTask(); return err; }
void cFUThread::SleepCurrentThread(unsigned long milliseconds) { // If you trigger this assert, you might be trying to sleep negative time! //assert(milliseconds < 10000, milliseconds = 0); #if defined (FP_APPLE) AbsoluteTime wakeup = AddDurationToAbsolute(milliseconds, UpTime()); MPDelayUntil(&wakeup); #else Sleep(milliseconds); #endif }
static void RcvSleep() { OSStatus junk; AbsoluteTime timeToWakeUp; MPLogPrintf("SFCRcv: Going to sleep for 1 seconds"); timeToWakeUp = AddDurationToAbsolute(1000, UpTime()); junk = MPDelayUntil(&timeToWakeUp); assert(junk == noErr); MPLogPrintf("SFCRcv: Waking up\n"); }
OSStatus safe_wait(function<OSStatus, Duration> &rFunction, Duration lDuration) { if(execution_context() == k_eExecutionContextMPTask) { return(rFunction(lDuration)); } else { uint64_t ullExpiration = 0ULL; // get the expiration time in UpTime units if(lDuration == kDurationForever) { ullExpiration = ::std::numeric_limits<uint64_t>::max(); } else if(lDuration == kDurationImmediate) { ullExpiration = force_cast<uint64_t>(UpTime()); } else { AbsoluteTime sExpiration = AddDurationToAbsolute(lDuration, UpTime()); ullExpiration = force_cast<uint64_t>(sExpiration); } OSStatus lStatus; bool bExpired = false; do { lStatus = rFunction(kDurationImmediate); // mm - "if" #if 0'd out to allow task time to threads blocked on I/O #if 0 if(lStatus == kMPTimeoutErr) #endif { idle(); } if(lDuration != kDurationForever) { bExpired = (force_cast<uint64_t>(UpTime()) < ullExpiration); } } while(lStatus == kMPTimeoutErr && bExpired == false); return(lStatus); } }
void wxThread::Sleep( unsigned long milliseconds ) { AbsoluteTime wakeup = AddDurationToAbsolute( milliseconds, UpTime() ); MPDelayUntil( &wakeup ); }
OSStatus safe_enter_critical_region(MPCriticalRegionID pCriticalRegionID, Duration lDuration, MPCriticalRegionID pCriticalRegionCriticalRegionID/* = kInvalidID*/) { if(pCriticalRegionCriticalRegionID != kInvalidID) { if(at_mp()) { // enter the critical region's critical region OSStatus lStatus = noErr; AbsoluteTime sExpiration; if(lDuration != kDurationImmediate && lDuration != kDurationForever) { sExpiration = AddDurationToAbsolute(lDuration, UpTime()); } lStatus = MPEnterCriticalRegion(pCriticalRegionCriticalRegionID, lDuration); assert(lStatus == noErr || lStatus == kMPTimeoutErr); if(lStatus == noErr) { // calculate a new duration if(lDuration != kDurationImmediate && lDuration != kDurationForever) { // check if we have any time left AbsoluteTime sUpTime(UpTime()); if(force_cast<uint64_t>(sExpiration) > force_cast<uint64_t>(sUpTime)) { // reset our duration to our remaining time lDuration = AbsoluteDeltaToDuration(sExpiration, sUpTime); } else { // no time left lDuration = kDurationImmediate; } } // if we entered the critical region, exit it again lStatus = MPExitCriticalRegion(pCriticalRegionCriticalRegionID); assert(lStatus == noErr); } else { // otherwise, give up return(lStatus); } } else { // if we're at system task time, try to enter the critical region's critical // region until we succeed. MP tasks will block on this until we let it go. OSStatus lStatus; do { lStatus = MPEnterCriticalRegion(pCriticalRegionCriticalRegionID, kDurationImmediate); } while(lStatus == kMPTimeoutErr); assert(lStatus == noErr); } } // try to enter the critical region function<OSStatus, Duration> oEnterCriticalRegion; oEnterCriticalRegion = bind(MPEnterCriticalRegion, pCriticalRegionID, _1); OSStatus lStatus = safe_wait(oEnterCriticalRegion, lDuration); // if we entered the critical region's critical region to get the critical region, // exit the critical region's critical region. if(pCriticalRegionCriticalRegionID != kInvalidID && at_mp() == false) { lStatus = MPExitCriticalRegion(pCriticalRegionCriticalRegionID); assert(lStatus == noErr); } return(lStatus); }