X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9c2882d9e1b17c600a196e1b69fbe66b98204151..adac097759c089b3d47f48c7756ace4f0b8df879:/src/unix/threadpsx.cpp diff --git a/src/unix/threadpsx.cpp b/src/unix/threadpsx.cpp index d708dbd703..8cebd7d212 100644 --- a/src/unix/threadpsx.cpp +++ b/src/unix/threadpsx.cpp @@ -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 , 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; } @@ -749,7 +767,7 @@ void wxThreadInternal::Wait() // we're cancelled inside pthread_join(), things will almost // certainly break - but if we disable the cancellation, we // might deadlock - if ( pthread_join((pthread *)id, &m_exitcode) != 0 ) + if ( pthread_join((pthread_t)id, &m_exitcode) != 0 ) { wxLogError(_("Failed to join a thread, potential memory leak " "detected - please restart the program")); @@ -835,7 +853,9 @@ bool wxThread::IsMain() void wxThread::Yield() { +#ifdef HAVE_SCHED_YIELD sched_yield(); +#endif } void wxThread::Sleep(unsigned long milliseconds) @@ -845,7 +865,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; @@ -1258,7 +1278,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 +1470,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; }