]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/thread.cpp
unload msimg32.dll earlier (before static cleanup time) to avoid lockups when wx...
[wxWidgets.git] / src / mac / carbon / thread.cpp
index 88e9abb5e023cd03c79faa3f799174842e4971d2..da4c2c1c9cc173e2e5610bac2ac4ed94a39b116d 100644 (file)
@@ -1,44 +1,32 @@
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
-// Name:          src/mac/carbon/thread.cpp
-// Purpose:      wxThread Implementation
-// Author:        Original from Wolfram Gloger/Guilhem Lavaux/Vadim Zeitlin
+// Name:        src/mac/carbon/thread.cpp
+// Purpose:     wxThread Implementation
+// Author:      Original from Wolfram Gloger/Guilhem Lavaux/Vadim Zeitlin
 // Modified by: Aj Lavin, Stefan Csomor
 // Modified by: Aj Lavin, Stefan Csomor
-// Created:       04/22/98
-// RCS-ID:        $Id$
-// Copyright:    (c) Wolfram Gloger (1996, 1997); Guilhem Lavaux (1998),
-//                     Vadim Zeitlin (1999), Stefan Csomor (2000)
-// Licence:        wxWindows licence
+// Created:     04/22/98
+// RCS-ID:      $Id$
+// Copyright:   (c) Wolfram Gloger (1996, 1997); Guilhem Lavaux (1998),
+//                  Vadim Zeitlin (1999), Stefan Csomor (2000)
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 #include "wx/wxprec.h"
 
 #if defined(__BORLANDC__)
 /////////////////////////////////////////////////////////////////////////////
 
 #include "wx/wxprec.h"
 
 #if defined(__BORLANDC__)
-#pragma hdrstop
+    #pragma hdrstop
 #endif
 
 #ifndef WX_PRECOMP
 #endif
 
 #ifndef WX_PRECOMP
-#include "wx/wx.h"
+    #include "wx/wx.h"
+    #include "wx/module.h"
 #endif
 
 #if wxUSE_THREADS
 
 #endif
 
 #if wxUSE_THREADS
 
-#include "wx/module.h"
 #include "wx/thread.h"
 
 #include "wx/thread.h"
 
-#ifdef __WXMAC__
-#ifdef __DARWIN__
-    #include <CoreServices/CoreServices.h>
-#else
-    #include <DriverServices.h>
-    #include <Multiprocessing.h>
-    #include "wx/math.h"
-#endif
-
+#include <CoreServices/CoreServices.h>
 #include "wx/mac/uma.h"
 #include "wx/mac/uma.h"
-#endif
-
-#include "wx/mac/macnotfy.h"
-
 
 // the possible states of the thread:
 // ("=>" shows all possible transitions from this state)
 
 // the possible states of the thread:
 // ("=>" shows all possible transitions from this state)
@@ -137,15 +125,9 @@ void wxCriticalSection::Leave()
 // wxMutex implementation
 // ----------------------------------------------------------------------------
 
 // wxMutex implementation
 // ----------------------------------------------------------------------------
 
-#if TARGET_API_MAC_OSX
 #define wxUSE_MAC_SEMAPHORE_MUTEX 0
 #define wxUSE_MAC_CRITICAL_REGION_MUTEX 1
 #define wxUSE_MAC_PTHREADS_MUTEX 0
 #define wxUSE_MAC_SEMAPHORE_MUTEX 0
 #define wxUSE_MAC_CRITICAL_REGION_MUTEX 1
 #define wxUSE_MAC_PTHREADS_MUTEX 0
-#else
-#define wxUSE_MAC_SEMAPHORE_MUTEX 0
-#define wxUSE_MAC_CRITICAL_REGION_MUTEX 1
-#define wxUSE_MAC_PTHREADS_MUTEX 0
-#endif
 
 #if wxUSE_MAC_PTHREADS_MUTEX
 
 
 #if wxUSE_MAC_PTHREADS_MUTEX
 
@@ -419,10 +401,10 @@ public:
     wxMutexInternal( wxMutexType mutexType );
     virtual ~wxMutexInternal();
 
     wxMutexInternal( wxMutexType mutexType );
     virtual ~wxMutexInternal();
 
-    bool IsOk() const
-    { return m_isOk; }
+    bool IsOk() const { return m_isOk; }
 
 
-    wxMutexError Lock() ;
+    wxMutexError Lock() { return Lock(kDurationForever); }
+    wxMutexError Lock(unsigned long ms);
     wxMutexError TryLock();
     wxMutexError Unlock();
 
     wxMutexError TryLock();
     wxMutexError Unlock();
 
@@ -431,7 +413,7 @@ private:
     bool m_isOk ;
 };
 
     bool m_isOk ;
 };
 
-wxMutexInternal::wxMutexInternal( wxMutexType mutexType )
+wxMutexInternal::wxMutexInternal( wxMutexType WXUNUSED(mutexType) )
 {
     m_isOk = false;
     m_critRegion = kInvalidID;
 {
     m_isOk = false;
     m_critRegion = kInvalidID;
@@ -452,15 +434,23 @@ wxMutexInternal::~wxMutexInternal()
     MPYield();
 }
 
     MPYield();
 }
 
-wxMutexError wxMutexInternal::Lock()
+wxMutexError wxMutexInternal::Lock(unsigned long ms)
 {
     wxCHECK_MSG( m_isOk , wxMUTEX_MISC_ERROR , wxT("Invalid Mutex") );
 
 {
     wxCHECK_MSG( m_isOk , wxMUTEX_MISC_ERROR , wxT("Invalid Mutex") );
 
-    OSStatus err = MPEnterCriticalRegion( m_critRegion, kDurationForever);
-    if (err != noErr)
+    OSStatus err = MPEnterCriticalRegion( m_critRegion, ms );
+    switch ( err )
     {
     {
-        wxLogSysError(wxT("Could not lock mutex"));
-        return wxMUTEX_MISC_ERROR;
+        case noErr:
+            break;
+
+        case kMPTimeoutErr:
+            wxASSERT_MSG( ms != kDurationForever, wxT("unexpected timeout") );
+            return wxMUTEX_TIMEOUT;
+
+        default:
+            wxLogSysError(wxT("Could not lock mutex"));
+            return wxMUTEX_MISC_ERROR;
     }
 
     return wxMUTEX_NO_ERROR;
     }
 
     return wxMUTEX_NO_ERROR;
@@ -830,7 +820,7 @@ wxCondError wxConditionInternal::WaitTimeout( unsigned long milliseconds )
 
     wxSemaError err = m_semaphore.WaitTimeout(milliseconds);
 
 
     wxSemaError err = m_semaphore.WaitTimeout(milliseconds);
 
-    if ( err == wxSEMA_BUSY )
+    if ( err == wxSEMA_TIMEOUT )
     {
         // another potential race condition exists here it is caused when a
         // 'waiting' thread timesout, and returns from WaitForSingleObject, but
     {
         // another potential race condition exists here it is caused when a
         // 'waiting' thread timesout, and returns from WaitForSingleObject, but
@@ -1040,7 +1030,7 @@ OSStatus wxThreadInternal::MacThreadStart(void *parameter)
     wxThreadInternal *pthread = thread->m_internal;
 
     // add to TLS so that This() will work
     wxThreadInternal *pthread = thread->m_internal;
 
     // add to TLS so that This() will work
-    verify_noerr( MPSetTaskStorageValue( gs_tlsForWXThread , (long) thread ) ) ;
+    verify_noerr( MPSetTaskStorageValue( gs_tlsForWXThread , (TaskStorageValue) thread ) ) ;
 
     // have to declare this before pthread_cleanup_push() which defines a
     // block!
 
     // have to declare this before pthread_cleanup_push() which defines a
     // block!
@@ -1248,9 +1238,7 @@ bool wxThread::IsMain()
 
 void wxThread::Yield()
 {
 
 void wxThread::Yield()
 {
-#if TARGET_API_MAC_OSX
     CFRunLoopRunInMode( kCFRunLoopDefaultMode , 0 , true ) ;
     CFRunLoopRunInMode( kCFRunLoopDefaultMode , 0 , true ) ;
-#endif
 
     MPYield();
 }
 
     MPYield();
 }
@@ -1271,7 +1259,7 @@ unsigned long wxThread::GetCurrentId()
     return (unsigned long)MPCurrentTaskID();
 }
 
     return (unsigned long)MPCurrentTaskID();
 }
 
-bool wxThread::SetConcurrency( size_t level )
+bool wxThread::SetConcurrency( size_t WXUNUSED(level) )
 {
     // Cannot be set in MacOS.
     return false;
 {
     // Cannot be set in MacOS.
     return false;
@@ -1641,7 +1629,12 @@ IMPLEMENT_DYNAMIC_CLASS(wxThreadModule, wxModule)
 
 bool wxThreadModule::OnInit()
 {
 
 bool wxThreadModule::OnInit()
 {
-    bool hasThreadManager = MPLibraryIsLoaded();
+    bool hasThreadManager = 
+#ifdef __LP64__ 
+        true ; // TODO VERIFY IN NEXT BUILD
+#else
+        MPLibraryIsLoaded();
+#endif
 
     if ( !hasThreadManager )
     {
 
     if ( !hasThreadManager )
     {