X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9ec1ed2a7eba603e37f7fc90141f2503a1d31954..99e839da3c9c40a3dac7cf1bb841d6459fcac1b0:/src/unix/threadpsx.cpp?ds=sidebyside diff --git a/src/unix/threadpsx.cpp b/src/unix/threadpsx.cpp index 89bc5109f7..1d32055350 100644 --- a/src/unix/threadpsx.cpp +++ b/src/unix/threadpsx.cpp @@ -21,11 +21,12 @@ // headers // ---------------------------------------------------------------------------- -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "thread.h" #endif -#include "wx/defs.h" +// for compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" #if wxUSE_THREADS @@ -58,6 +59,12 @@ #include #endif +#ifdef __VMS + #define THR_ID(thr) ((long long)(thr)->GetId()) +#else + #define THR_ID(thr) ((long)(thr)->GetId()) +#endif + // ---------------------------------------------------------------------------- // constants // ---------------------------------------------------------------------------- @@ -122,10 +129,10 @@ static wxMutex *gs_mutexDeleteThread = (wxMutex *)NULL; // gs_nThreadsBeingDeleted will have been deleted static wxCondition *gs_condAllDeleted = (wxCondition *)NULL; -#if wxUSE_GUI - // this mutex must be acquired before any call to a GUI function - static wxMutex *gs_mutexGui; -#endif // wxUSE_GUI +// this mutex must be acquired before any call to a GUI function +// (it's not inside #if wxUSE_GUI because this file is compiled as part +// of wxBase) +static wxMutex *gs_mutexGui = NULL; // when we wait for a thread to exit, we're blocking on a condition which the // thread signals in its SignalExit() method -- but this condition can't be a @@ -166,6 +173,12 @@ private: friend class wxConditionInternal; }; +#ifdef HAVE_PTHREAD_MUTEXATTR_T +// on some systems pthread_mutexattr_settype() is not in the headers (but it is +// in the library, otherwise we wouldn't compile this code at all) +extern "C" int pthread_mutexattr_settype(pthread_mutexattr_t *, int); +#endif + wxMutexInternal::wxMutexInternal(wxMutexType mutexType) { int err; @@ -488,14 +501,14 @@ wxSemaError wxSemaphoreInternal::Wait() while ( m_count == 0 ) { wxLogTrace(TRACE_SEMA, - "Thread %ld waiting for semaphore to become signalled", + _T("Thread %ld waiting for semaphore to become signalled"), wxThread::GetCurrentId()); if ( m_cond.Wait() != wxCOND_NO_ERROR ) return wxSEMA_MISC_ERROR; wxLogTrace(TRACE_SEMA, - "Thread %ld finished waiting for semaphore, count = %lu", + _T("Thread %ld finished waiting for semaphore, count = %lu"), wxThread::GetCurrentId(), (unsigned long)m_count); } @@ -532,8 +545,17 @@ wxSemaError wxSemaphoreInternal::WaitTimeout(unsigned long milliseconds) return wxSEMA_TIMEOUT; } - if ( m_cond.WaitTimeout(remainingTime) != wxCOND_NO_ERROR ) - return wxSEMA_MISC_ERROR; + switch ( m_cond.WaitTimeout(remainingTime) ) + { + case wxCOND_TIMEOUT: + return wxSEMA_TIMEOUT; + + default: + return wxSEMA_MISC_ERROR; + + case wxCOND_NO_ERROR: + ; + } } m_count--; @@ -553,7 +575,7 @@ wxSemaError wxSemaphoreInternal::Post() m_count++; wxLogTrace(TRACE_SEMA, - "Thread %ld about to signal semaphore, count = %lu", + _T("Thread %ld about to signal semaphore, count = %lu"), wxThread::GetCurrentId(), (unsigned long)m_count); return m_cond.Signal() == wxCOND_NO_ERROR ? wxSEMA_NO_ERROR @@ -696,12 +718,8 @@ void *wxThreadInternal::PthreadStart(wxThread *thread) { wxThreadInternal *pthread = thread->m_internal; -#ifdef __VMS - wxLogTrace(TRACE_THREADS, _T("Thread %ld started."), (long long)pthread->GetId()); -#else - wxLogTrace(TRACE_THREADS, _T("Thread %ld started."), (long)pthread->GetId()); -#endif - + wxLogTrace(TRACE_THREADS, _T("Thread %ld started."), THR_ID(pthread)); + // associate the thread pointer with the newly created thread so that // wxThread::This() will work int rc = pthread_setspecific(gs_keySelf, thread); @@ -737,22 +755,16 @@ void *wxThreadInternal::PthreadStart(wxThread *thread) if ( !dontRunAtAll ) { // call the main entry - wxLogTrace(TRACE_THREADS, _T("Thread %ld about to enter its Entry()."), -#ifdef __VMS - (long long)pthread->GetId()); -#else - (long)pthread->GetId()); -#endif - + wxLogTrace(TRACE_THREADS, + _T("Thread %ld about to enter its Entry()."), + THR_ID(pthread)); + pthread->m_exitcode = thread->Entry(); - wxLogTrace(TRACE_THREADS, _T("Thread %ld Entry() returned %lu."), -#ifdef __VMS - (long long)pthread->GetId(), (unsigned long)pthread->m_exitcode); -#else - (long)pthread->GetId(), (unsigned long)pthread->m_exitcode); -#endif - + wxLogTrace(TRACE_THREADS, + _T("Thread %ld Entry() returned %lu."), + THR_ID(pthread), (unsigned long)pthread->m_exitcode); + { wxCriticalSectionLocker lock(thread->m_critsect); @@ -861,12 +873,9 @@ void wxThreadInternal::Wait() wxMutexGuiLeave(); wxLogTrace(TRACE_THREADS, -#ifdef __VMS - _T("Starting to wait for thread %ld to exit."), (long long)GetId()); -#else - _T("Starting to wait for thread %ld to exit."), (long)GetId()); -#endif - + _T("Starting to wait for thread %ld to exit."), + THR_ID(this)); + // to avoid memory leaks we should call pthread_join(), but it must only be // done once so use a critical section to serialize the code below { @@ -904,12 +913,9 @@ void wxThreadInternal::Pause() wxCHECK_RET( m_state == STATE_PAUSED, wxT("thread must first be paused with wxThread::Pause().") ); -#ifdef __VMS - wxLogTrace(TRACE_THREADS, _T("Thread %ld goes to sleep."), (long long)GetId()); -#else - wxLogTrace(TRACE_THREADS, _T("Thread %ld goes to sleep."), (long)GetId()); -#endif - + wxLogTrace(TRACE_THREADS, + _T("Thread %ld goes to sleep."), THR_ID(this)); + // wait until the semaphore is Post()ed from Resume() m_semSuspend.Wait(); } @@ -923,12 +929,9 @@ void wxThreadInternal::Resume() // TestDestroy() since the last call to Pause() for example if ( IsReallyPaused() ) { -#ifdef __VMS - wxLogTrace(TRACE_THREADS, _T("Waking up thread %ld"), (long long)GetId()); -#else - wxLogTrace(TRACE_THREADS, _T("Waking up thread %ld"), (long)GetId()); -#endif - + wxLogTrace(TRACE_THREADS, + _T("Waking up thread %ld"), THR_ID(this)); + // wake up Pause() m_semSuspend.Post(); @@ -937,12 +940,8 @@ void wxThreadInternal::Resume() } else { - wxLogTrace(TRACE_THREADS, _T("Thread %ld is not yet really paused"), -#ifdef __VMS - (long long)GetId()); -#else - (long)GetId()); -#endif + wxLogTrace(TRACE_THREADS, + _T("Thread %ld is not yet really paused"), THR_ID(this)); } SetState(STATE_RUNNING); @@ -1015,19 +1014,24 @@ int wxThread::GetCPUCount() return -1; } +// VMS is a 64 bit system and threads have 64 bit pointers. +// FIXME: also needed for other systems???? #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 +} + +#else // !__VMS + unsigned long wxThread::GetCurrentId() { return (unsigned long)pthread_self(); -#endif } +#endif // __VMS/!__VMS + + bool wxThread::SetConcurrency(size_t level) { #ifdef HAVE_THR_SETCONCURRENCY @@ -1601,11 +1605,8 @@ bool wxThreadModule::OnInit() gs_tidMain = pthread_self(); -#if wxUSE_GUI gs_mutexGui = new wxMutex(); - gs_mutexGui->Lock(); -#endif // wxUSE_GUI gs_mutexDeleteThread = new wxMutex(); gs_condAllDeleted = new wxCondition( *gs_mutexDeleteThread ); @@ -1650,12 +1651,9 @@ void wxThreadModule::OnExit() gs_allThreads[0]->Delete(); } -#if wxUSE_GUI // destroy GUI mutex gs_mutexGui->Unlock(); - delete gs_mutexGui; -#endif // wxUSE_GUI // and free TLD slot (void)pthread_key_delete(gs_keySelf); @@ -1704,16 +1702,12 @@ static void DeleteThread(wxThread *This) void wxMutexGuiEnter() { -#if wxUSE_GUI gs_mutexGui->Lock(); -#endif // wxUSE_GUI } void wxMutexGuiLeave() { -#if wxUSE_GUI gs_mutexGui->Unlock(); -#endif // wxUSE_GUI } // ----------------------------------------------------------------------------