X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/cf25117b67548f2fcf40ef829a10b8e4d1870e48..daef46890032872c25f353ad8d60941a00eb32ef:/src/unix/threadpsx.cpp diff --git a/src/unix/threadpsx.cpp b/src/unix/threadpsx.cpp index 3da088548d..746698e560 100644 --- a/src/unix/threadpsx.cpp +++ b/src/unix/threadpsx.cpp @@ -37,6 +37,7 @@ #include "wx/intl.h" #include "wx/dynarray.h" #include "wx/timer.h" +#include "wx/stopwatch.h" #include #include @@ -590,10 +591,10 @@ wxSemaError wxSemaphoreInternal::Post() extern "C" { -#if HAVE_THREAD_CLEANUP_FUNCTIONS +#ifdef wxHAVE_PTHREAD_CLEANUP // thread exit function void wxPthreadCleanup(void *ptr); -#endif // HAVE_THREAD_CLEANUP_FUNCTIONS +#endif // wxHAVE_PTHREAD_CLEANUP void *wxPthreadStart(void *ptr); @@ -670,10 +671,10 @@ public: m_isDetached = TRUE; } -#if HAVE_THREAD_CLEANUP_FUNCTIONS +#ifdef wxHAVE_PTHREAD_CLEANUP // this is used by wxPthreadCleanup() only static void Cleanup(wxThread *thread); -#endif // HAVE_THREAD_CLEANUP_FUNCTIONS +#endif // wxHAVE_PTHREAD_CLEANUP private: pthread_t m_threadId; // id of the thread @@ -734,11 +735,11 @@ void *wxThreadInternal::PthreadStart(wxThread *thread) // block! bool dontRunAtAll; -#if HAVE_THREAD_CLEANUP_FUNCTIONS +#ifdef wxHAVE_PTHREAD_CLEANUP // install the cleanup handler which will be called if the thread is // cancelled pthread_cleanup_push(wxPthreadCleanup, thread); -#endif // HAVE_THREAD_CLEANUP_FUNCTIONS +#endif // wxHAVE_PTHREAD_CLEANUP // wait for the semaphore to be posted from Run() pthread->m_semRun.Wait(); @@ -778,10 +779,10 @@ void *wxThreadInternal::PthreadStart(wxThread *thread) // NB: at least under Linux, pthread_cleanup_push/pop are macros and pop // contains the matching '}' for the '{' in push, so they must be used // in the same block! -#if HAVE_THREAD_CLEANUP_FUNCTIONS +#ifdef wxHAVE_PTHREAD_CLEANUP // remove the cleanup handler without executing it pthread_cleanup_pop(FALSE); -#endif // HAVE_THREAD_CLEANUP_FUNCTIONS +#endif // wxHAVE_PTHREAD_CLEANUP if ( dontRunAtAll ) { @@ -801,7 +802,7 @@ void *wxThreadInternal::PthreadStart(wxThread *thread) } } -#if HAVE_THREAD_CLEANUP_FUNCTIONS +#ifdef wxHAVE_PTHREAD_CLEANUP // this handler is called when the thread is cancelled extern "C" void wxPthreadCleanup(void *ptr) @@ -824,7 +825,7 @@ void wxThreadInternal::Cleanup(wxThread *thread) thread->Exit(EXITCODE_CANCELLED); } -#endif // HAVE_THREAD_CLEANUP_FUNCTIONS +#endif // wxHAVE_PTHREAD_CLEANUP // ---------------------------------------------------------------------------- // wxThreadInternal @@ -1434,14 +1435,14 @@ wxThreadError wxThread::Kill() { // if we use cleanup function, this will be done from // wxPthreadCleanup() -#if !HAVE_THREAD_CLEANUP_FUNCTIONS +#ifndef wxHAVE_PTHREAD_CLEANUP ScheduleThreadForDeletion(); // 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 +#endif // wxHAVE_PTHREAD_CLEANUP } else { @@ -1483,6 +1484,12 @@ void wxThread::Exit(ExitCode status) // only call one thread function at a time :-( DeleteThread(this); } + else + { + m_critsect.Enter(); + m_internal->SetState(STATE_EXITED); + m_critsect.Leave(); + } // terminate the thread (pthread_exit() never returns) pthread_exit(status);