]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/thread.cpp
made sure the alignment for the non-carbon fake list def resource is always 68k
[wxWidgets.git] / src / mac / thread.cpp
index a8243467ed776479f8c49ec19c51c8774ca9d3e7..26e1b0517df9fc6a460dcb5e6717bfa075941615 100644 (file)
 #include "wx/module.h"
 #include "wx/thread.h"
 
+#ifdef __WXMAC__
+#include "wx/mac/uma.h"
+#endif
+
 // ----------------------------------------------------------------------------
 // constants
 // ----------------------------------------------------------------------------
@@ -65,11 +69,13 @@ class wxMacStCritical
 public :
     wxMacStCritical() 
     {
-        ThreadBeginCritical() ;
+        if ( UMASystemIsInitialized() )
+            ThreadBeginCritical() ;
     }
     ~wxMacStCritical()
     {
-        ThreadEndCritical() ;
+        if ( UMASystemIsInitialized() )
+            ThreadEndCritical() ;
     }
 };
 
@@ -114,19 +120,21 @@ wxMutex::~wxMutex()
 wxMutexError wxMutex::Lock()
 {
     wxMacStCritical critical ;
-    
-    OSErr err ;
-    ThreadID current = kNoThreadID;
-    err = ::MacGetCurrentThread(&current);
-    // 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(&current);
+        // 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;
@@ -135,15 +143,17 @@ wxMutexError wxMutex::Lock()
 wxMutexError wxMutex::TryLock()
 {
     wxMacStCritical critical ;
-    
-    OSErr err ;
-    ThreadID current = kNoThreadID;
-    ::MacGetCurrentThread(&current);
-    // 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(&current);
+        // 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;
@@ -151,32 +161,39 @@ wxMutexError wxMutex::TryLock()
 
 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;
 }