X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/903506828b7d042350eae97b5014a63ffca17ef5..a4a162522b875bc7cb23f1d165703f71bd7010f7:/src/unix/threadpsx.cpp diff --git a/src/unix/threadpsx.cpp b/src/unix/threadpsx.cpp index fd9b12c731..e10fe97e82 100644 --- a/src/unix/threadpsx.cpp +++ b/src/unix/threadpsx.cpp @@ -490,12 +490,18 @@ void wxCondition::Broadcast() // wxThread (Posix implementation) //-------------------------------------------------------------------- +// the thread callback functions must have the C linkage +extern "C" +{ + #if HAVE_THREAD_CLEANUP_FUNCTIONS + // thread exit function + void wxPthreadCleanup(void *ptr); +#endif // HAVE_THREAD_CLEANUP_FUNCTIONS -// thread exit function -extern "C" void wxPthreadCleanup(void *ptr); +void *wxPthreadStart(void *ptr); -#endif // HAVE_THREAD_CLEANUP_FUNCTIONS +} // extern "C" class wxThreadInternal { @@ -504,7 +510,7 @@ public: ~wxThreadInternal(); // thread entry function - static void *PthreadStart(void *ptr); + static void *PthreadStart(wxThread *thread); // thread actions // start the thread @@ -600,9 +606,13 @@ private: // thread startup and exit functions // ---------------------------------------------------------------------------- -void *wxThreadInternal::PthreadStart(void *ptr) +void *wxPthreadStart(void *ptr) +{ + return wxThreadInternal::PthreadStart((wxThread *)ptr); +} + +void *wxThreadInternal::PthreadStart(wxThread *thread) { - wxThread *thread = (wxThread *)ptr; wxThreadInternal *pthread = thread->m_internal; // associate the thread pointer with the newly created thread so that @@ -622,7 +632,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(wxPthreadCleanup, ptr); + pthread_cleanup_push(wxPthreadCleanup, thread); #endif // HAVE_THREAD_CLEANUP_FUNCTIONS // wait for the condition to be signaled from Run() @@ -918,6 +928,19 @@ int wxThread::GetCPUCount() return -1; } +#ifdef __VMS + // VMS is a 64 bit system and threads have 64 bit pointers. + // ??? also needed for other systems???? +unsigned long long wxThread::GetCurrentId() +{ + return (unsigned long long)pthread_self(); +#else +unsigned long wxThread::GetCurrentId() +{ + return (unsigned long)pthread_self(); +#endif +} + bool wxThread::SetConcurrency(size_t level) { #ifdef HAVE_THR_SETCONCURRENCY @@ -976,7 +999,7 @@ wxThreadError wxThread::Create(unsigned int WXUNUSED(stackSize)) #define sched_get_priority_min(_pol_) \ (_pol_ == SCHED_OTHER ? PRI_FG_MIN_NP : PRI_FIFO_MIN) #endif - + int max_prio = sched_get_priority_max(policy), min_prio = sched_get_priority_min(policy), prio = m_internal->GetPriority(); @@ -1042,7 +1065,7 @@ wxThreadError wxThread::Create(unsigned int WXUNUSED(stackSize)) ( m_internal->GetIdPtr(), &attr, - wxThreadInternal::PthreadStart, + wxPthreadStart, (void *)this );