示例#1
0
void CriticalSection::unlock() {
#if defined(_WIN32)
    LeaveCriticalSection( &self->criticalSection );
#elif defined(__APPLE__)
    MPExitCriticalRegion( self->criticalSection );
#elif defined(__linux__)
    pthread_mutex_unlock( &self->criticalSection );
#endif
}
示例#2
0
int CFSMutex::Unlock()
{
#if defined (WIN32)
	::LeaveCriticalSection(&m_hMutex);
#elif defined (UNIX)
	pthread_mutex_unlock(&m_hMutex);
#elif defined (MAC)
	MPExitCriticalRegion(m_hMutex);
#endif
	return 0;
}
示例#3
0
wxMutexError wxMutexInternal::Unlock()
{
    wxCHECK_MSG( m_isOk , wxMUTEX_MISC_ERROR , wxT("Invalid Mutex") ) ;
	OSStatus err = MPExitCriticalRegion( m_critRegion);
	if ( err)
    {
		wxLogSysError(_("Could not unlock mutex"));
		return wxMUTEX_MISC_ERROR;	  
    }
    
	return wxMUTEX_NO_ERROR;
}
OSStatus
keyboard_handler(EventHandlerCallRef,
   EventRef event,
   void *)
{
   unsigned char key;
   GetEventParameter(event,kEventParamKeyMacCharCodes,typeChar,0,sizeof(key),0,&key);
 
   MPEnterCriticalRegion(cr,kDurationForever);

   if (key == 27) {
      exit(0);
   }

   MPExitCriticalRegion(cr);

   return noErr;
}
示例#5
0
void wxCriticalSection::Leave()
{
    MPExitCriticalRegion( (MPCriticalRegionID) m_critRegion );
}
示例#6
0
文件: safe.cpp 项目: Karlan88/xray
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);
}