Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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
}
Ejemplo n.º 3
0
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");
}
Ejemplo n.º 4
0
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);
    }
}
Ejemplo n.º 5
0
void wxThread::Sleep( unsigned long milliseconds )
{
    AbsoluteTime wakeup = AddDurationToAbsolute( milliseconds, UpTime() );
    MPDelayUntil( &wakeup );
}
Ejemplo n.º 6
0
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);
}