// headers
// ----------------------------------------------------------------------------
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
#pragma implementation "thread.h"
#endif
-#include "wx/defs.h"
+// for compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
#if wxUSE_THREADS
// 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
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;
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--;
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;
gs_tidMain = pthread_self();
-#if wxUSE_GUI
gs_mutexGui = new wxMutex();
-
gs_mutexGui->Lock();
-#endif // wxUSE_GUI
gs_mutexDeleteThread = new wxMutex();
gs_condAllDeleted = new wxCondition( *gs_mutexDeleteThread );
gs_allThreads[0]->Delete();
}
-#if wxUSE_GUI
// destroy GUI mutex
gs_mutexGui->Unlock();
-
delete gs_mutexGui;
-#endif // wxUSE_GUI
// and free TLD slot
(void)pthread_key_delete(gs_keySelf);
void wxMutexGuiEnter()
{
-#if wxUSE_GUI
gs_mutexGui->Lock();
-#endif // wxUSE_GUI
}
void wxMutexGuiLeave()
{
-#if wxUSE_GUI
gs_mutexGui->Unlock();
-#endif // wxUSE_GUI
}
// ----------------------------------------------------------------------------