]> git.saurik.com Git - wxWidgets.git/blobdiff - src/unix/threadpsx.cpp
made sure the alignment for the non-carbon fake list def resource is always 68k
[wxWidgets.git] / src / unix / threadpsx.cpp
index 5bbb54a77826457f2ea1dc0bfbd0491a617e2add..14edbfc078eda8438069adf7cae8ceca650bd00b 100644 (file)
@@ -135,7 +135,7 @@ static pthread_key_t gs_keySelf;
 static size_t gs_nThreadsBeingDeleted = 0;
 
 // a mutex to protect gs_nThreadsBeingDeleted
-static pthread_mutex_t gs_mutexDeleteThread = PTHREAD_MUTEX_INITIALIZER;
+static pthread_mutex_t gs_mutexDeleteThread;
 
 // and a condition variable which will be signaled when all
 // gs_nThreadsBeingDeleted will have been deleted
@@ -164,8 +164,26 @@ wxMutex::wxMutex()
 {
     m_internal = new wxMutexInternal;
 
-    pthread_mutex_init(&(m_internal->m_mutex),
-                       (pthread_mutexattr_t*) NULL );
+    // support recursive locks like Win32, i.e. a thread can lock a mutex which
+    // it had itself already locked
+    //
+    // but initialization of recursive mutexes is non portable <sigh>, so try
+    // several methods
+#ifdef HAVE_PTHREAD_MUTEXATTR_T
+    pthread_mutexattr_t attr;
+    pthread_mutexattr_init(&attr);
+    pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
+
+    pthread_mutex_init(&(m_internal->m_mutex), &attr);
+#elif defined(HAVE_PTHREAD_RECURSIVE_MUTEX_INITIALIZER)
+    // we can use this only as initializer so we have to assign it first to a
+    // temp var - assigning directly to m_mutex wouldn't even compile
+    pthread_mutex_t mutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
+    m_internal->m_mutex = mutex;
+#else // no recursive mutexes
+    pthread_mutex_init(&(m_internal->m_mutex), NULL);
+#endif // HAVE_PTHREAD_MUTEXATTR_T/...
+
     m_locked = 0;
 }
 
@@ -725,8 +743,12 @@ void wxThreadInternal::Wait()
         wxMutexGuiLeave();
 
     bool isDetached = m_isDetached;
-    long id = (long)GetId();
-    wxLogTrace(TRACE_THREADS, _T("Starting to wait for thread %ld to exit."),
+#ifdef __VMS
+   long long id = (long long)GetId();
+#else
+   long id = (long)GetId();
+#endif
+   wxLogTrace(TRACE_THREADS, _T("Starting to wait for thread %ld to exit."),
                id);
 
     // wait until the thread terminates (we're blocking in _another_ thread,
@@ -835,7 +857,9 @@ bool wxThread::IsMain()
 
 void wxThread::Yield()
 {
+#ifdef HAVE_SCHED_YIELD
     sched_yield();
+#endif
 }
 
 void wxThread::Sleep(unsigned long milliseconds)
@@ -845,7 +869,7 @@ void wxThread::Sleep(unsigned long milliseconds)
 
 int wxThread::GetCPUCount()
 {
-#if defined(__LINUX__)
+#if defined(__LINUX__) && wxUSE_FFILE
     // read from proc (can't use wxTextFile here because it's a special file:
     // it has 0 size but still can be read from)
     wxLogNull nolog;
@@ -914,7 +938,7 @@ wxThread::wxThread(wxThreadKind kind)
     m_isDetached = kind == wxTHREAD_DETACHED;
 }
 
-wxThreadError wxThread::Create()
+wxThreadError wxThread::Create(unsigned int WXUNUSED(stackSize))
 {
     if ( m_internal->GetState() != STATE_NEW )
     {
@@ -1085,9 +1109,15 @@ unsigned int wxThread::GetPriority() const
     return m_internal->GetPriority();
 }
 
+#ifdef __VMS
+unsigned long long wxThread::GetId() const
+{
+    return (unsigned long long)m_internal->GetId();
+#else
 unsigned long wxThread::GetId() const
 {
     return (unsigned long)m_internal->GetId();
+#endif
 }
 
 // -----------------------------------------------------------------------------
@@ -1258,7 +1288,8 @@ wxThreadError wxThread::Kill()
 #if !HAVE_THREAD_CLEANUP_FUNCTIONS
                 ScheduleThreadForDeletion();
 
-                OnExit();
+                // don't call OnExit() here, it can only be called in the
+                // threads context and we're in the context of another thread
 
                 DeleteThread(this);
 #endif // HAVE_THREAD_CLEANUP_FUNCTIONS
@@ -1449,6 +1480,10 @@ bool wxThreadModule::OnInit()
     gs_mutexGui->Lock();
 #endif // wxUSE_GUI
 
+    // under Solaris we get a warning from CC when using
+    // PTHREAD_MUTEX_INITIALIZER, so do it dynamically
+    pthread_mutex_init(&gs_mutexDeleteThread, NULL);
+
     return TRUE;
 }