예제 #1
0
파일: safe.cpp 프로젝트: Karlan88/xray
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);
    }
}
예제 #2
0
파일: safe.cpp 프로젝트: Karlan88/xray
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);
    }
}
예제 #3
0
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();
}
예제 #4
0
inline bool at_mp()
    {    return(execution_context() == k_eExecutionContextMPTask);        }
예제 #5
0
inline bool at_st()
    {    return(execution_context() == k_eExecutionContextSystemTask);    }