X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/fd91cec1417a06b5e0ee09b3e677da5cc73ea0a3..6da991dbf0b611c2fb5f337b334037f2641a896b:/src/unix/threadpsx.cpp diff --git a/src/unix/threadpsx.cpp b/src/unix/threadpsx.cpp index a5fa470848..a133ba9fa0 100644 --- a/src/unix/threadpsx.cpp +++ b/src/unix/threadpsx.cpp @@ -27,8 +27,10 @@ #if wxUSE_THREADS #include "wx/thread.h" +#include "wx/except.h" #ifndef WX_PRECOMP + #include "wx/app.h" #include "wx/dynarray.h" #include "wx/intl.h" #include "wx/log.h" @@ -65,6 +67,17 @@ #define THR_ID(thr) ((long)(thr)->GetId()) #endif +#ifdef __WXMAC__ + + // implement wxCriticalSection using mutexes +wxCriticalSection::wxCriticalSection( wxCriticalSectionType critSecType ) + : m_mutex( critSecType == wxCRITSEC_DEFAULT ? wxMUTEX_RECURSIVE : wxMUTEX_DEFAULT ) { } +wxCriticalSection::~wxCriticalSection() { } + +void wxCriticalSection::Enter() { (void)m_mutex.Lock(); } +void wxCriticalSection::Leave() { (void)m_mutex.Unlock(); } + +#endif // ---------------------------------------------------------------------------- // constants // ---------------------------------------------------------------------------- @@ -255,6 +268,7 @@ wxMutexError wxMutexInternal::Lock() wxMutexError wxMutexInternal::Lock(unsigned long ms) { +#ifdef HAVE_PTHREAD_MUTEX_TIMEDLOCK static const long MSEC_IN_SEC = 1000; static const long NSEC_IN_MSEC = 1000000; static const long NSEC_IN_USEC = 1000; @@ -295,6 +309,11 @@ wxMutexError wxMutexInternal::Lock(unsigned long ms) } return HandleLockResult(pthread_mutex_timedlock(&m_mutex, &ts)); +#else // !HAVE_PTHREAD_MUTEX_TIMEDLOCK + wxUnusedVar(ms); + + return wxMUTEX_MISC_ERROR; +#endif // HAVE_PTHREAD_MUTEX_TIMEDLOCK/!HAVE_PTHREAD_MUTEX_TIMEDLOCK } wxMutexError wxMutexInternal::HandleLockResult(int err) @@ -820,11 +839,15 @@ void *wxThreadInternal::PthreadStart(wxThread *thread) _T("Thread %ld about to enter its Entry()."), THR_ID(pthread)); - pthread->m_exitcode = thread->Entry(); + wxTRY + { + pthread->m_exitcode = thread->Entry(); - wxLogTrace(TRACE_THREADS, - _T("Thread %ld Entry() returned %lu."), - THR_ID(pthread), wxPtrToUInt(pthread->m_exitcode)); + wxLogTrace(TRACE_THREADS, + _T("Thread %ld Entry() returned %lu."), + THR_ID(pthread), wxPtrToUInt(pthread->m_exitcode)); + } + wxCATCH_ALL( wxTheApp->OnUnhandledException(); ) { wxCriticalSectionLocker lock(thread->m_critsect); @@ -1038,11 +1061,6 @@ void wxThread::Yield() #endif } -void wxThread::Sleep(unsigned long milliseconds) -{ - wxMilliSleep(milliseconds); -} - int wxThread::GetCPUCount() { #if defined(_SC_NPROCESSORS_ONLN) @@ -1305,7 +1323,7 @@ void wxThread::SetPriority(unsigned int prio) // map wx priorites WXTHREAD_MIN_PRIORITY..WXTHREAD_MAX_PRIORITY // to Unix priorities 20..-20 - if ( setpriority(PRIO_PROCESS, 0, -(2*prio)/5 + 20) == -1 ) + if ( setpriority(PRIO_PROCESS, 0, -(2*(int)prio)/5 + 20) == -1 ) { wxLogError(_("Failed to set thread priority %d."), prio); } @@ -1536,7 +1554,11 @@ void wxThread::Exit(ExitCode status) // might deadlock if, for example, it signals a condition in OnExit() (a // common case) while the main thread calls any of functions entering // m_critsect on us (almost all of them do) - OnExit(); + wxTRY + { + OnExit(); + } + wxCATCH_ALL( wxTheApp->OnUnhandledException(); ) // delete C++ thread object if this is a detached thread - user is // responsible for doing this for joinable ones @@ -1784,12 +1806,12 @@ static void DeleteThread(wxThread *This) } } -void wxMutexGuiEnter() +void wxMutexGuiEnterImpl() { gs_mutexGui->Lock(); } -void wxMutexGuiLeave() +void wxMutexGuiLeaveImpl() { gs_mutexGui->Unlock(); }