X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d9b9876f6eceab934d81ff2ca48702493150f5b9..8af27d1dee477e3e52aa60d73b19d46f531374b7:/src/unix/threadpsx.cpp?ds=sidebyside diff --git a/src/unix/threadpsx.cpp b/src/unix/threadpsx.cpp index 8207ca3576..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 ) @@ -743,8 +753,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, @@ -865,7 +879,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; @@ -934,7 +948,7 @@ wxThread::wxThread(wxThreadKind kind) m_isDetached = kind == wxTHREAD_DETACHED; } -wxThreadError wxThread::Create() +wxThreadError wxThread::Create(unsigned int WXUNUSED(stackSize)) { if ( m_internal->GetState() != STATE_NEW ) { @@ -1105,9 +1119,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 } // ----------------------------------------------------------------------------- @@ -1274,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();