X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ed58dbeab64d18a0f869ea8e1610a0a88ad7b22c..f38374d0d7aa865e9bbe8ee61b75b94ffcdfb220:/include/wx/thread.h?ds=inline diff --git a/include/wx/thread.h b/include/wx/thread.h index fc734e6878..552e342f0e 100644 --- a/include/wx/thread.h +++ b/include/wx/thread.h @@ -137,7 +137,10 @@ private: #if defined(__WXMSW__) || defined(__WXPM__) class WXDLLEXPORT wxCriticalSectionInternal; #define WXCRITICAL_INLINE -#else // !MSW +#elif defined(__WXMAC__) + class WXDLLEXPORT wxCriticalSectionInternal; + #define WXCRITICAL_INLINE +#else // !MSW && !PM #define WXCRITICAL_INLINE inline #endif // MSW/!MSW @@ -160,7 +163,7 @@ private: wxCriticalSection(const wxCriticalSection&); wxCriticalSection& operator=(const wxCriticalSection&); -#if defined(__WXMSW__) || defined(__WXPM__) +#if defined(__WXMSW__) || defined(__WXPM__) || defined(__WXMAC__) wxCriticalSectionInternal *m_critsect; #else // !MSW wxMutex m_mutex; @@ -175,10 +178,8 @@ private: class WXDLLEXPORT wxCriticalSectionLocker { public: - wxCriticalSectionLocker(wxCriticalSection& critsect) : m_critsect(critsect) - { m_critsect.Enter(); } - ~wxCriticalSectionLocker() - { m_critsect.Leave(); } + inline wxCriticalSectionLocker(wxCriticalSection& critsect); + inline ~wxCriticalSectionLocker(); private: // no assignment operator nor copy ctor @@ -350,6 +351,12 @@ private: void WXDLLEXPORT wxMutexGuiEnter(); void WXDLLEXPORT wxMutexGuiLeave(); +// macros for entering/leaving critical sections which may be used without +// having to take them inside "#if wxUSE_THREADS" +#define wxENTER_CRIT_SECT(cs) (cs)->Enter() +#define wxLEAVE_CRIT_SECT(cs) (cs)->Leave() +#define wxCRIT_SECT_LOCKER(name, cs) wxCriticalSectionLocker name(*cs) + #else // !wxUSE_THREADS #include "wx/defs.h" // for WXDLLEXPORT @@ -358,6 +365,12 @@ void WXDLLEXPORT wxMutexGuiLeave(); inline void WXDLLEXPORT wxMutexGuiEnter() { } inline void WXDLLEXPORT wxMutexGuiLeave() { } +// macros for entering/leaving critical sections which may be used without +// having to take them inside "#if wxUSE_THREADS" +#define wxENTER_CRIT_SECT(cs) +#define wxLEAVE_CRIT_SECT(cs) +#define wxCRIT_SECT_LOCKER(name, cs) + #endif // wxUSE_THREADS // automatically unlock GUI mutex in dtor @@ -371,8 +384,10 @@ public: // ----------------------------------------------------------------------------- // implementation only until the end of file // ----------------------------------------------------------------------------- + #if wxUSE_THREADS -#if defined(__WXMSW__) || defined(__WXPM__) + +#if defined(__WXMSW__) // unlock GUI if there are threads waiting for and lock it back when // there are no more of them - should be called periodically by the main // thread @@ -387,7 +402,30 @@ public: // return TRUE if the main thread is waiting for some other to terminate: // wxApp then should block all "dangerous" messages extern bool WXDLLEXPORT wxIsWaitingForThread(); -#else // !MSW +#elif defined(__WXMAC__) + extern void WXDLLEXPORT wxMutexGuiLeaveOrEnter(); + + // returns TRUE if the main thread has GUI lock + extern bool WXDLLEXPORT wxGuiOwnedByMainThread(); + + // wakes up the main thread if it's sleeping inside ::GetMessage() + extern void WXDLLEXPORT wxWakeUpMainThread(); + + // return TRUE if the main thread is waiting for some other to terminate: + // wxApp then should block all "dangerous" messages + extern bool WXDLLEXPORT wxIsWaitingForThread(); +#elif defined(__WXPM__) + // unlock GUI if there are threads waiting for and lock it back when + // there are no more of them - should be called periodically by the main + // thread + extern void WXDLLEXPORT wxMutexGuiLeaveOrEnter(); + + // returns TRUE if the main thread has GUI lock + extern bool WXDLLEXPORT wxGuiOwnedByMainThread(); + // return TRUE if the main thread is waiting for some other to terminate: + // wxApp then should block all "dangerous" messages + extern bool WXDLLEXPORT wxIsWaitingForThread(); +#else // !MSW && !PM // implement wxCriticalSection using mutexes inline wxCriticalSection::wxCriticalSection() { } inline wxCriticalSection::~wxCriticalSection() { } @@ -395,6 +433,14 @@ public: inline void wxCriticalSection::Enter() { (void)m_mutex.Lock(); } inline void wxCriticalSection::Leave() { (void)m_mutex.Unlock(); } #endif // MSW/!MSW + + // we can define these inline functions now (they should be defined after + // wxCriticalSection::Enter/Leave) + inline + wxCriticalSectionLocker:: wxCriticalSectionLocker(wxCriticalSection& cs) + : m_critsect(cs) { m_critsect.Enter(); } + inline + wxCriticalSectionLocker::~wxCriticalSectionLocker() { m_critsect.Leave(); } #endif // wxUSE_THREADS #endif // __THREADH__