From 02f463e9cc49326438c4b2f8dfb28dc4ecf7557e Mon Sep 17 00:00:00 2001 From: Stefan Csomor Date: Tue, 8 Jun 2004 14:48:10 +0000 Subject: [PATCH] direct ie non mutex crit-section implementation git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@27690 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/thread.h | 4 +++- src/mac/carbon/thread.cpp | 28 ++++++++++++++++++++++++++-- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/include/wx/thread.h b/include/wx/thread.h index 7d61023195..c9fe01b71f 100644 --- a/include/wx/thread.h +++ b/include/wx/thread.h @@ -209,7 +209,7 @@ private: // in order to avoid any overhead under platforms where critical sections are // just mutexes make all wxCriticalSection class functions inline -#if !defined(__WXMSW__) +#if !defined(__WXMSW__) && !defined(__WXMAC__) #define wxCRITSECT_IS_MUTEX 1 #define wxCRITSECT_INLINE inline @@ -261,6 +261,8 @@ private: wxCritSectBuffer m_buffer; }; +#elif defined(__WXMAC__) + void *m_critRegion ; #endif // Unix&OS2/Win32 DECLARE_NO_COPY_CLASS(wxCriticalSection) diff --git a/src/mac/carbon/thread.cpp b/src/mac/carbon/thread.cpp index 84de36ee2b..6c477b3685 100644 --- a/src/mac/carbon/thread.cpp +++ b/src/mac/carbon/thread.cpp @@ -114,16 +114,40 @@ MPCriticalRegionID gs_guiCritical = kInvalidID; to use two indices one for each 32 bit part as the MP implementation is limited to longs. - I have two implementations for mutexes : + I have three implementations for mutexes : version A based on a binary semaphore, problem - not reentrant, version B based on a critical region, allows for reentrancy, performance implications not - yet tested + yet tested, and third a plain pthreads implementation The same for condition internal, one implementation by Aj Lavin and the other one copied from the thrimpl.cpp which I assume has been more broadly tested, I've just replaced the interlock increment with the appropriate PPC calls */ +// ---------------------------------------------------------------------------- +// wxCriticalSection +// ---------------------------------------------------------------------------- + +wxCriticalSection::wxCriticalSection() +{ + MPCreateCriticalRegion( (MPCriticalRegionID*) &m_critRegion ) ; +} + +wxCriticalSection::~wxCriticalSection() +{ + MPDeleteCriticalRegion( (MPCriticalRegionID) m_critRegion ) ; +} + +void wxCriticalSection::Enter() +{ + MPEnterCriticalRegion( (MPCriticalRegionID) m_critRegion , kDurationForever ) ; +} + +void wxCriticalSection::Leave() +{ + MPExitCriticalRegion((MPCriticalRegionID) m_critRegion ) ; +} + // ---------------------------------------------------------------------------- // wxMutex implementation // ---------------------------------------------------------------------------- -- 2.45.2