X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/6fe7378863be6febaaab0e8aa855b51781351ac5..8af27d1dee477e3e52aa60d73b19d46f531374b7:/src/unix/threadpsx.cpp diff --git a/src/unix/threadpsx.cpp b/src/unix/threadpsx.cpp index 14edbfc078..fd9b12c731 100644 --- a/src/unix/threadpsx.cpp +++ b/src/unix/threadpsx.cpp @@ -490,6 +490,13 @@ void wxCondition::Broadcast() // wxThread (Posix implementation) //-------------------------------------------------------------------- +#if HAVE_THREAD_CLEANUP_FUNCTIONS + +// thread exit function +extern "C" void wxPthreadCleanup(void *ptr); + +#endif // HAVE_THREAD_CLEANUP_FUNCTIONS + class wxThreadInternal { public: @@ -499,11 +506,6 @@ public: // thread entry function static void *PthreadStart(void *ptr); -#if HAVE_THREAD_CLEANUP_FUNCTIONS - // thread exit function - static void PthreadCleanup(void *ptr); -#endif - // thread actions // start the thread wxThreadError Run(); @@ -549,6 +551,11 @@ public: // sometimes - tell the thread that it should do it void Notify() { m_shouldBroadcast = TRUE; } +#if HAVE_THREAD_CLEANUP_FUNCTIONS + // this is used by wxPthreadCleanup() only + static void Cleanup(wxThread *thread); +#endif // HAVE_THREAD_CLEANUP_FUNCTIONS + private: pthread_t m_threadId; // id of the thread wxThreadState m_state; // see wxThreadState enum @@ -615,7 +622,7 @@ void *wxThreadInternal::PthreadStart(void *ptr) #if HAVE_THREAD_CLEANUP_FUNCTIONS // install the cleanup handler which will be called if the thread is // cancelled - pthread_cleanup_push(wxThreadInternal::PthreadCleanup, ptr); + pthread_cleanup_push(wxPthreadCleanup, ptr); #endif // HAVE_THREAD_CLEANUP_FUNCTIONS // wait for the condition to be signaled from Run() @@ -645,7 +652,7 @@ void *wxThreadInternal::PthreadStart(void *ptr) pthread->GetId()); // change the state of the thread to "exited" so that - // PthreadCleanup handler won't do anything from now (if it's + // wxPthreadCleanup handler won't do anything from now (if it's // called before we do pthread_cleanup_pop below) pthread->SetState(STATE_EXITED); } @@ -679,10 +686,13 @@ void *wxThreadInternal::PthreadStart(void *ptr) #if HAVE_THREAD_CLEANUP_FUNCTIONS // this handler is called when the thread is cancelled -void wxThreadInternal::PthreadCleanup(void *ptr) +extern "C" void wxPthreadCleanup(void *ptr) { - wxThread *thread = (wxThread *) ptr; + wxThreadInternal::Cleanup((wxThread *)ptr); +} +void wxThreadInternal::Cleanup(wxThread *thread) +{ { wxCriticalSectionLocker lock(thread->m_critsect); if ( thread->m_internal->GetState() == STATE_EXITED ) @@ -1284,7 +1294,7 @@ wxThreadError wxThread::Kill() if ( m_isDetached ) { // if we use cleanup function, this will be done from - // PthreadCleanup() + // wxPthreadCleanup() #if !HAVE_THREAD_CLEANUP_FUNCTIONS ScheduleThreadForDeletion();