]> git.saurik.com Git - wxWidgets.git/commitdiff
direct ie non mutex crit-section implementation
authorStefan Csomor <csomor@advancedconcepts.ch>
Tue, 8 Jun 2004 14:48:10 +0000 (14:48 +0000)
committerStefan Csomor <csomor@advancedconcepts.ch>
Tue, 8 Jun 2004 14:48:10 +0000 (14:48 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@27690 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/thread.h
src/mac/carbon/thread.cpp

index 7d61023195c87411d40633569bb66ce3c6825f77..c9fe01b71f3fd299199903d1e5f5760b0e6d1f8f 100644 (file)
@@ -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)
index 84de36ee2bf07b530835346284266f549bfda4ae..6c477b3685b804d0cbf4714b14c731c60d22fa06 100644 (file)
@@ -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
 // ----------------------------------------------------------------------------