]> git.saurik.com Git - wxWidgets.git/commitdiff
implement wxMutex::LockTimeout() using critical region API too
authorVadim Zeitlin <vadim@wxwidgets.org>
Fri, 9 Mar 2007 23:21:22 +0000 (23:21 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Fri, 9 Mar 2007 23:21:22 +0000 (23:21 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@44705 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/mac/carbon/thread.cpp

index b747d70922e1bb8ba0005ff9f073a15b628723ed..a2d66b51f3373812184dcad6e1aa97564bf5fc6c 100644 (file)
@@ -418,10 +418,10 @@ public:
     wxMutexInternal( wxMutexType mutexType );
     virtual ~wxMutexInternal();
 
-    bool IsOk() const
-    { return m_isOk; }
+    bool IsOk() const { return m_isOk; }
 
-    wxMutexError Lock() ;
+    wxMutexError Lock() { return Lock(kDurationForever); }
+    wxMutexError Lock(unsigned long ms);
     wxMutexError TryLock();
     wxMutexError Unlock();
 
@@ -451,15 +451,23 @@ wxMutexInternal::~wxMutexInternal()
     MPYield();
 }
 
-wxMutexError wxMutexInternal::Lock()
+wxMutexError wxMutexInternal::Lock(unsigned long ms)
 {
     wxCHECK_MSG( m_isOk , wxMUTEX_MISC_ERROR , wxT("Invalid Mutex") );
 
-    OSStatus err = MPEnterCriticalRegion( m_critRegion, kDurationForever);
-    if (err != noErr)
+    OSStatus err = MPEnterCriticalRegion( m_critRegion, ms );
+    switch ( err )
     {
-        wxLogSysError(wxT("Could not lock mutex"));
-        return wxMUTEX_MISC_ERROR;
+        case noErr:
+            break;
+
+        case kMPTimeoutErr:
+            wxASSERT_MSG( ms != kDurationForever, wxT("unexpected timeout") );
+            return wxMUTEX_TIMEOUT;
+
+        default:
+            wxLogSysError(wxT("Could not lock mutex"));
+            return wxMUTEX_MISC_ERROR;
     }
 
     return wxMUTEX_NO_ERROR;