From: Vadim Zeitlin Date: Mon, 11 Jan 1999 15:51:45 +0000 (+0000) Subject: wxCriticalSection implemented using mutexes for !MSW (sample compiles again) X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/f6ddc54a659d3f45c4dcd83eb4a70a92fdf7a391 wxCriticalSection implemented using mutexes for !MSW (sample compiles again) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1372 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/thread.h b/include/wx/thread.h index 906a4eb517..4a545bd537 100644 --- a/include/wx/thread.h +++ b/include/wx/thread.h @@ -114,8 +114,6 @@ private: wxMutex *m_mutex; }; -#ifdef __WXMSW__ - // ---------------------------------------------------------------------------- // Critical section: this is the same as mutex but is only visible to the // threads of the same process. For the platforms which don't have native @@ -125,25 +123,34 @@ private: // you should consider wxCriticalSectionLocker whenever possible instead of // directly working with wxCriticalSection class - it is safer -class WXDLLEXPORT wxCriticalSectionInternal; +#ifdef __WXMSW__ + class WXDLLEXPORT wxCriticalSectionInternal; + #define WXCRITICAL_INLINE +#else // !MSW + #define WXCRITICAL_INLINE inline +#endif // MSW/!MSW class WXDLLEXPORT wxCriticalSection { public: // ctor & dtor - wxCriticalSection(); - ~wxCriticalSection(); + WXCRITICAL_INLINE wxCriticalSection(); + WXCRITICAL_INLINE ~wxCriticalSection(); // enter the section (the same as locking a mutex) - void Enter(); + void WXCRITICAL_INLINE Enter(); // leave the critical section (same as unlocking a mutex) - void Leave(); + void WXCRITICAL_INLINE Leave(); private: // no assignment operator nor copy ctor wxCriticalSection(const wxCriticalSection&); wxCriticalSection& operator=(const wxCriticalSection&); +#ifdef __WXMSW__ wxCriticalSectionInternal *m_critsect; +#else // !MSW + wxMutex m_mutex; +#endif // MSW/!MSW }; // wxCriticalSectionLocker is the same to critical sections as wxMutexLocker is @@ -164,8 +171,6 @@ private: wxCriticalSection& m_critsect; }; -#endif - // ---------------------------------------------------------------------------- // Condition handler. // ---------------------------------------------------------------------------- @@ -269,20 +274,6 @@ private: void WXDLLEXPORT wxMutexGuiEnter(); void WXDLLEXPORT wxMutexGuiLeave(); -// implementation only -#ifdef __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 - void WXDLLEXPORT wxMutexGuiLeaveOrEnter(); - - // returns TRUE if the main thread has GUI lock - inline bool WXDLLEXPORT wxGuiOwnedByMainThread(); - - // wakes up the main thread if it's sleeping inside ::GetMessage() - inline void WXDLLEXPORT wxWakeUpMainThread(); -#endif // MSW - #else // !wxUSE_THREADS // no thread support @@ -299,4 +290,29 @@ public: ~wxMutexGuiLocker() { wxMutexGuiLeave(); } }; +// ----------------------------------------------------------------------------- +// implementation only until the end of file +// ----------------------------------------------------------------------------- +#ifdef wxUSE_THREADS +#ifdef __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 + void WXDLLEXPORT wxMutexGuiLeaveOrEnter(); + + // returns TRUE if the main thread has GUI lock + inline bool WXDLLEXPORT wxGuiOwnedByMainThread(); + + // wakes up the main thread if it's sleeping inside ::GetMessage() + inline void WXDLLEXPORT wxWakeUpMainThread(); +#else // !MSW + // implement wxCriticalSection using mutexes + inline wxCriticalSection::wxCriticalSection() { } + inline wxCriticalSection::~wxCriticalSection() { } + + inline void wxCriticalSection::Enter() { (void)m_mutex.Lock(); } + inline void wxCriticalSection::Leave() { (void)m_mutex.Unlock(); } +#endif // MSW/!MSW +#endif // wxUSE_THREADS + #endif // __THREADH__