#include "wx/thread.h"
#ifdef __WXMAC__
-#include "wx/mac/private.h"
+#include "wx/mac/uma.h"
#endif
// ----------------------------------------------------------------------------
public :
wxMacStCritical()
{
- ThreadBeginCritical() ;
+ if ( UMASystemIsInitialized() )
+ ThreadBeginCritical() ;
}
~wxMacStCritical()
{
- ThreadEndCritical() ;
+ if ( UMASystemIsInitialized() )
+ ThreadEndCritical() ;
}
};
wxMutexError wxMutex::Lock()
{
wxMacStCritical critical ;
-
- OSErr err ;
- ThreadID current = kNoThreadID;
- err = ::MacGetCurrentThread(¤t);
- // if we are not the owner, add this thread to the list of waiting threads, stop this thread
- // and invoke the scheduler to continue executing the owner's thread
- while ( m_internal->m_owner != kNoThreadID && m_internal->m_owner != current)
- {
- m_internal->m_waiters.Add(current);
- err = ::SetThreadStateEndCritical(kCurrentThreadID, kStoppedThreadState, m_internal->m_owner);
- err = ::ThreadBeginCritical();
+ if ( UMASystemIsInitialized() )
+ {
+ OSErr err ;
+ ThreadID current = kNoThreadID;
+ err = ::MacGetCurrentThread(¤t);
+ // if we are not the owner, add this thread to the list of waiting threads, stop this thread
+ // and invoke the scheduler to continue executing the owner's thread
+ while ( m_internal->m_owner != kNoThreadID && m_internal->m_owner != current)
+ {
+ m_internal->m_waiters.Add(current);
+ err = ::SetThreadStateEndCritical(kCurrentThreadID, kStoppedThreadState, m_internal->m_owner);
+ err = ::ThreadBeginCritical();
+ }
+ m_internal->m_owner = current;
}
- m_internal->m_owner = current;
m_locked++;
return wxMUTEX_NO_ERROR;
wxMutexError wxMutex::TryLock()
{
wxMacStCritical critical ;
-
- OSErr err ;
- ThreadID current = kNoThreadID;
- ::MacGetCurrentThread(¤t);
- // if we are not the owner, give an error back
- if ( m_internal->m_owner != kNoThreadID && m_internal->m_owner != current )
- return wxMUTEX_BUSY;
-
- m_internal->m_owner = current;
+ if ( UMASystemIsInitialized() )
+ {
+ OSErr err ;
+ ThreadID current = kNoThreadID;
+ ::MacGetCurrentThread(¤t);
+ // if we are not the owner, give an error back
+ if ( m_internal->m_owner != kNoThreadID && m_internal->m_owner != current )
+ return wxMUTEX_BUSY;
+
+ m_internal->m_owner = current;
+ }
m_locked++;
return wxMUTEX_NO_ERROR;
wxMutexError wxMutex::Unlock()
{
- OSErr err;
- err = ::ThreadBeginCritical();
-
- if (m_locked > 0)
- m_locked--;
+ if ( UMASystemIsInitialized() )
+ {
+ OSErr err;
+ err = ::ThreadBeginCritical();
+
+ if (m_locked > 0)
+ m_locked--;
- // this mutex is not owned by anybody anmore
- m_internal->m_owner = kNoThreadID;
+ // this mutex is not owned by anybody anmore
+ m_internal->m_owner = kNoThreadID;
- // now pass on to the first waiting thread
- ThreadID firstWaiting = kNoThreadID;
- bool found = false;
- while (!m_internal->m_waiters.IsEmpty() && !found)
+ // now pass on to the first waiting thread
+ ThreadID firstWaiting = kNoThreadID;
+ bool found = false;
+ while (!m_internal->m_waiters.IsEmpty() && !found)
+ {
+ firstWaiting = m_internal->m_waiters[0];
+ err = ::SetThreadState(firstWaiting, kReadyThreadState, kNoThreadID);
+ // in case this was not successful (dead thread), we just loop on and reset the id
+ found = (err != threadNotFoundErr);
+ if ( !found )
+ firstWaiting = kNoThreadID ;
+ m_internal->m_waiters.RemoveAt(0) ;
+ }
+ // now we have a valid firstWaiting thread, which has been scheduled to run next, just end the
+ // critical section and invoke the scheduler
+ err = ::SetThreadStateEndCritical(kCurrentThreadID, kReadyThreadState, firstWaiting);
+ }
+ else
{
- firstWaiting = m_internal->m_waiters[0];
- err = ::SetThreadState(firstWaiting, kReadyThreadState, kNoThreadID);
- // in case this was not successful (dead thread), we just loop on and reset the id
- found = (err != threadNotFoundErr);
- if ( !found )
- firstWaiting = kNoThreadID ;
- m_internal->m_waiters.RemoveAt(0) ;
+ if (m_locked > 0)
+ m_locked--;
}
- // now we have a valid firstWaiting thread, which has been scheduled to run next, just end the
- // critical section and invoke the scheduler
- err = ::SetThreadStateEndCritical(kCurrentThreadID, kReadyThreadState, firstWaiting);
-
return wxMUTEX_NO_ERROR;
}