X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b18cfdd9bdcfd498042b41bb5302e5fdb220a4f8..16d38102e8ad5534d185cc532b9aa8077a75e0a4:/src/unix/threadpsx.cpp diff --git a/src/unix/threadpsx.cpp b/src/unix/threadpsx.cpp index f0a19482a0..ccec6bbc2e 100644 --- a/src/unix/threadpsx.cpp +++ b/src/unix/threadpsx.cpp @@ -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 , 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, @@ -847,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; @@ -1087,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 } // -----------------------------------------------------------------------------