X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/fb10f04c957b3712c04ddec92d083209e127b011..f1d93f0beeec9d88f8a225aa35a9ccc163dcdb15:/src/unix/threadpsx.cpp diff --git a/src/unix/threadpsx.cpp b/src/unix/threadpsx.cpp index c0a1a533a8..f0a19482a0 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 @@ -725,7 +725,7 @@ void wxThreadInternal::Wait() wxMutexGuiLeave(); bool isDetached = m_isDetached; - long id = GetId(); + long id = (long)GetId(); wxLogTrace(TRACE_THREADS, _T("Starting to wait for thread %ld to exit."), id); @@ -749,7 +749,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(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 +835,9 @@ bool wxThread::IsMain() void wxThread::Yield() { +#ifdef HAVE_SCHED_YIELD sched_yield(); +#endif } void wxThread::Sleep(unsigned long milliseconds) @@ -1258,7 +1260,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 +1452,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; }