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); } }
OSStatus safe_delay_until(AbsoluteTime *pWakeUpTime) { if(execution_context() == k_eExecutionContextMPTask) { return(MPDelayUntil(pWakeUpTime)); } else { uint64_t ullWakeUpTime = force_cast<uint64_t>(*pWakeUpTime); while(force_cast<uint64_t>(UpTime()) < ullWakeUpTime) { idle(); } return(noErr); } }
execution_context execution_context::current() noexcept { // initialized the first time control passes; per thread thread_local static detail::activation_record_initializer initializer; return execution_context(); }
inline bool at_mp() { return(execution_context() == k_eExecutionContextMPTask); }
inline bool at_st() { return(execution_context() == k_eExecutionContextSystemTask); }