X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7bfe6a32e0be5a4e4b349d25ccaf87a1ed9ab127..c0440c7833f4a7966fac477b1541b085142adaa6:/src/unix/threadpsx.cpp diff --git a/src/unix/threadpsx.cpp b/src/unix/threadpsx.cpp index d87748e03f..597f87eb8d 100644 --- a/src/unix/threadpsx.cpp +++ b/src/unix/threadpsx.cpp @@ -166,6 +166,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; @@ -210,7 +216,7 @@ wxMutexInternal::wxMutexInternal(wxMutexType mutexType) m_isOk = err == 0; if ( !m_isOk ) { - wxLogApiError("pthread_mutex_init()", err); + wxLogApiError( wxT("pthread_mutex_init()"), err); } } @@ -221,7 +227,7 @@ wxMutexInternal::~wxMutexInternal() int err = pthread_mutex_destroy(&m_mutex); if ( err != 0 ) { - wxLogApiError("pthread_mutex_destroy()", err); + wxLogApiError( wxT("pthread_mutex_destroy()"), err); } } } @@ -495,8 +501,8 @@ wxSemaError wxSemaphoreInternal::Wait() return wxSEMA_MISC_ERROR; wxLogTrace(TRACE_SEMA, - "Thread %ld finished waiting for semaphore, count = %u", - wxThread::GetCurrentId(), m_count); + "Thread %ld finished waiting for semaphore, count = %lu", + wxThread::GetCurrentId(), (unsigned long)m_count); } m_count--; @@ -532,8 +538,17 @@ wxSemaError wxSemaphoreInternal::WaitTimeout(unsigned long milliseconds) return wxSEMA_TIMEOUT; } - if ( m_cond.Wait(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,9 +568,9 @@ wxSemaError wxSemaphoreInternal::Post() m_count++; wxLogTrace(TRACE_SEMA, - "Thread %ld about to signal semaphore, count = %u", - wxThread::GetCurrentId(), m_count); - + "Thread %ld about to signal semaphore, count = %lu", + wxThread::GetCurrentId(), (unsigned long)m_count); + return m_cond.Signal() == wxCOND_NO_ERROR ? wxSEMA_NO_ERROR : wxSEMA_MISC_ERROR; } @@ -620,7 +635,7 @@ public: }; wxLogTrace(TRACE_THREADS, _T("Thread %ld: %s => %s."), - GetId(), stateNames[m_state], stateNames[state]); + (long)GetId(), stateNames[m_state], stateNames[state]); #endif // __WXDEBUG__ m_state = state; @@ -696,8 +711,12 @@ void *wxThreadInternal::PthreadStart(wxThread *thread) { wxThreadInternal *pthread = thread->m_internal; - wxLogTrace(TRACE_THREADS, _T("Thread %ld started."), pthread->GetId()); - +#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 + // associate the thread pointer with the newly created thread so that // wxThread::This() will work int rc = pthread_setspecific(gs_keySelf, thread); @@ -734,13 +753,21 @@ void *wxThreadInternal::PthreadStart(wxThread *thread) { // call the main entry wxLogTrace(TRACE_THREADS, _T("Thread %ld about to enter its Entry()."), - pthread->GetId()); - +#ifdef __VMS + (long long)pthread->GetId()); +#else + (long)pthread->GetId()); +#endif + pthread->m_exitcode = thread->Entry(); wxLogTrace(TRACE_THREADS, _T("Thread %ld Entry() returned %lu."), - pthread->GetId(), (unsigned long)pthread->m_exitcode); - +#ifdef __VMS + (long long)pthread->GetId(), (unsigned long)pthread->m_exitcode); +#else + (long)pthread->GetId(), (unsigned long)pthread->m_exitcode); +#endif + { wxCriticalSectionLocker lock(thread->m_critsect); @@ -849,8 +876,12 @@ void wxThreadInternal::Wait() wxMutexGuiLeave(); wxLogTrace(TRACE_THREADS, - _T("Starting to wait for thread %ld to exit."), GetId()); - +#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 + // 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 { @@ -862,7 +893,7 @@ void wxThreadInternal::Wait() // we're cancelled inside pthread_join(), things will almost // certainly break - but if we disable the cancellation, we // might deadlock - if ( pthread_join((pthread_t)GetId(), &m_exitcode) != 0 ) + if ( pthread_join(GetId(), &m_exitcode) != 0 ) { // this is a serious problem, so use wxLogError and not // wxLogDebug: it is possible to bring the system to its knees @@ -888,8 +919,12 @@ void wxThreadInternal::Pause() wxCHECK_RET( m_state == STATE_PAUSED, wxT("thread must first be paused with wxThread::Pause().") ); - wxLogTrace(TRACE_THREADS, _T("Thread %ld goes to sleep."), GetId()); - +#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 + // wait until the semaphore is Post()ed from Resume() m_semSuspend.Wait(); } @@ -903,8 +938,12 @@ void wxThreadInternal::Resume() // TestDestroy() since the last call to Pause() for example if ( IsReallyPaused() ) { - wxLogTrace(TRACE_THREADS, _T("Waking up thread %ld"), GetId()); - +#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 + // wake up Pause() m_semSuspend.Post(); @@ -914,7 +953,11 @@ void wxThreadInternal::Resume() else { wxLogTrace(TRACE_THREADS, _T("Thread %ld is not yet really paused"), - GetId()); +#ifdef __VMS + (long long)GetId()); +#else + (long)GetId()); +#endif } SetState(STATE_RUNNING); @@ -960,8 +1003,8 @@ int wxThread::GetCPUCount() wxString s; if ( file.ReadAll(&s) ) { - // (ab)use Replace() to find the number of "processor" strings - size_t count = s.Replace(_T("processor"), _T("")); + // (ab)use Replace() to find the number of "processor: num" strings + size_t count = s.Replace(_T("processor\t:"), _T("")); if ( count > 0 ) { return count; @@ -1598,8 +1641,9 @@ void wxThreadModule::OnExit() if ( nThreadsBeingDeleted > 0 ) { - wxLogTrace(TRACE_THREADS, _T("Waiting for %u threads to disappear"), - nThreadsBeingDeleted); + wxLogTrace(TRACE_THREADS, + _T("Waiting for %lu threads to disappear"), + (unsigned long)nThreadsBeingDeleted); // have to wait until all of them disappear gs_condAllDeleted->Wait(); @@ -1610,8 +1654,8 @@ void wxThreadModule::OnExit() size_t count = gs_allThreads.GetCount(); if ( count != 0u ) { - wxLogDebug(wxT("%u threads were not terminated by the application."), - count); + wxLogDebug(wxT("%lu threads were not terminated by the application."), + (unsigned long)count); } for ( size_t n = 0u; n < count; n++ ) @@ -1645,8 +1689,8 @@ static void ScheduleThreadForDeletion() gs_nThreadsBeingDeleted++; - wxLogTrace(TRACE_THREADS, _T("%u thread%s waiting to be deleted"), - gs_nThreadsBeingDeleted, + wxLogTrace(TRACE_THREADS, _T("%lu thread%s waiting to be deleted"), + (unsigned long)gs_nThreadsBeingDeleted, gs_nThreadsBeingDeleted == 1 ? "" : "s"); } @@ -1663,8 +1707,8 @@ static void DeleteThread(wxThread *This) wxCHECK_RET( gs_nThreadsBeingDeleted > 0, _T("no threads scheduled for deletion, yet we delete one?") ); - wxLogTrace(TRACE_THREADS, _T("%u scheduled for deletion threads left."), - gs_nThreadsBeingDeleted - 1); + wxLogTrace(TRACE_THREADS, _T("%lu scheduled for deletion threads left."), + (unsigned long)gs_nThreadsBeingDeleted - 1); if ( !--gs_nThreadsBeingDeleted ) {