]> git.saurik.com Git - wxWidgets.git/blobdiff - src/unix/threadpsx.cpp
WXMAKINGDLL --> WXMAKINGDLL_CORE and also fixed name of resources file
[wxWidgets.git] / src / unix / threadpsx.cpp
index b4b91685b9d24b9eb12619421cda46bc92fbbb92..d6e805347fe9011d5c02628475d9214a5feb0e86 100644 (file)
 // headers
 // ----------------------------------------------------------------------------
 
 // headers
 // ----------------------------------------------------------------------------
 
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
     #pragma implementation "thread.h"
 #endif
 
     #pragma implementation "thread.h"
 #endif
 
-#include "wx/defs.h"
+// for compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
 
 #if wxUSE_THREADS
 
 
 #if wxUSE_THREADS
 
@@ -122,10 +123,10 @@ static wxMutex *gs_mutexDeleteThread = (wxMutex *)NULL;
 // gs_nThreadsBeingDeleted will have been deleted
 static wxCondition *gs_condAllDeleted = (wxCondition *)NULL;
 
 // gs_nThreadsBeingDeleted will have been deleted
 static wxCondition *gs_condAllDeleted = (wxCondition *)NULL;
 
-#if wxUSE_GUI
-    // this mutex must be acquired before any call to a GUI function
-    static wxMutex *gs_mutexGui;
-#endif // wxUSE_GUI
+// this mutex must be acquired before any call to a GUI function
+// (it's not inside #if wxUSE_GUI because this file is compiled as part
+// of wxBase)
+static wxMutex *gs_mutexGui = NULL;
 
 // when we wait for a thread to exit, we're blocking on a condition which the
 // thread signals in its SignalExit() method -- but this condition can't be a
 
 // when we wait for a thread to exit, we're blocking on a condition which the
 // thread signals in its SignalExit() method -- but this condition can't be a
@@ -166,6 +167,12 @@ private:
     friend class wxConditionInternal;
 };
 
     friend class wxConditionInternal;
 };
 
+#ifdef HAVE_PTHREAD_MUTEXATTR_T
+// on some systems pthread_mutexattr_settype() is not in the headers (but it is
+// in the library, otherwise we wouldn't compile this code at all)
+extern "C" int pthread_mutexattr_settype(pthread_mutexattr_t *, int);
+#endif
+
 wxMutexInternal::wxMutexInternal(wxMutexType mutexType)
 {
     int err;
 wxMutexInternal::wxMutexInternal(wxMutexType mutexType)
 {
     int err;
@@ -532,8 +539,17 @@ wxSemaError wxSemaphoreInternal::WaitTimeout(unsigned long milliseconds)
             return wxSEMA_TIMEOUT;
         }
 
             return wxSEMA_TIMEOUT;
         }
 
-        if ( m_cond.Wait(remainingTime) != wxCOND_NO_ERROR )
-            return wxSEMA_MISC_ERROR;
+        switch ( m_cond.WaitTimeout(remainingTime) )
+        {
+            case wxCOND_TIMEOUT:
+                return wxSEMA_TIMEOUT;
+
+            default:
+                return wxSEMA_MISC_ERROR;
+
+            case wxCOND_NO_ERROR:
+                ;
+        }
     }
 
     m_count--;
     }
 
     m_count--;
@@ -988,8 +1004,8 @@ int wxThread::GetCPUCount()
         wxString s;
         if ( file.ReadAll(&s) )
         {
         wxString s;
         if ( file.ReadAll(&s) )
         {
-            // (ab)use Replace() to find the number of "processor" strings
-            size_t count = s.Replace(_T("processor"), _T(""));
+            // (ab)use Replace() to find the number of "processor: num" strings
+            size_t count = s.Replace(_T("processor\t:"), _T(""));
             if ( count > 0 )
             {
                 return count;
             if ( count > 0 )
             {
                 return count;
@@ -1601,11 +1617,8 @@ bool wxThreadModule::OnInit()
 
     gs_tidMain = pthread_self();
 
 
     gs_tidMain = pthread_self();
 
-#if wxUSE_GUI
     gs_mutexGui = new wxMutex();
     gs_mutexGui = new wxMutex();
-
     gs_mutexGui->Lock();
     gs_mutexGui->Lock();
-#endif // wxUSE_GUI
 
     gs_mutexDeleteThread = new wxMutex();
     gs_condAllDeleted = new wxCondition( *gs_mutexDeleteThread );
 
     gs_mutexDeleteThread = new wxMutex();
     gs_condAllDeleted = new wxCondition( *gs_mutexDeleteThread );
@@ -1650,12 +1663,9 @@ void wxThreadModule::OnExit()
         gs_allThreads[0]->Delete();
     }
 
         gs_allThreads[0]->Delete();
     }
 
-#if wxUSE_GUI
     // destroy GUI mutex
     gs_mutexGui->Unlock();
     // destroy GUI mutex
     gs_mutexGui->Unlock();
-
     delete gs_mutexGui;
     delete gs_mutexGui;
-#endif // wxUSE_GUI
 
     // and free TLD slot
     (void)pthread_key_delete(gs_keySelf);
 
     // and free TLD slot
     (void)pthread_key_delete(gs_keySelf);
@@ -1704,16 +1714,12 @@ static void DeleteThread(wxThread *This)
 
 void wxMutexGuiEnter()
 {
 
 void wxMutexGuiEnter()
 {
-#if wxUSE_GUI
     gs_mutexGui->Lock();
     gs_mutexGui->Lock();
-#endif // wxUSE_GUI
 }
 
 void wxMutexGuiLeave()
 {
 }
 
 void wxMutexGuiLeave()
 {
-#if wxUSE_GUI
     gs_mutexGui->Unlock();
     gs_mutexGui->Unlock();
-#endif // wxUSE_GUI
 }
 
 // ----------------------------------------------------------------------------
 }
 
 // ----------------------------------------------------------------------------