]> git.saurik.com Git - wxWidgets.git/commitdiff
Add wxCondition::Wait() overload that also tests the condition.
authorVáclav Slavík <vslavik@fastmail.fm>
Fri, 6 Sep 2013 17:09:05 +0000 (17:09 +0000)
committerVáclav Slavík <vslavik@fastmail.fm>
Fri, 6 Sep 2013 17:09:05 +0000 (17:09 +0000)
Add Wait() overload that takes a functor argument and doesn't return
until the condition is signaled _and_ the predicate returns true.  This
is useful for dealing with spurious wakeups and is modeled after C++11
std::condition_variable's corresponding method.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@74771 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/thread.h
interface/wx/thread.h

index 796a7dd188c3b385a0249528d2f53204e2dd9e8f..086007f82623a10382460acaf9cabc8fcaa2e4af 100644 (file)
@@ -344,6 +344,19 @@ public:
     // the lock on the associated mutex object, before returning.
     wxCondError Wait();
 
+    // std::condition_variable-like variant that evaluates the associated condition
+    template<typename Functor>
+    wxCondError Wait(const Functor& predicate)
+    {
+        while ( !predicate() )
+        {
+            wxCondError e = Wait();
+            if ( e != wxCOND_NO_ERROR )
+                return e;
+        }
+        return wxCOND_NO_ERROR;
+    }
+
     // exactly as Wait() except that it may also return if the specified
     // timeout elapses even if the condition hasn't been signalled: in this
     // case, the return value is wxCOND_TIMEOUT, otherwise (i.e. in case of a
index 5ec3a58a8c3340bc2f2ca0f7c349cf58f50feeeb..61becf58477f3db70eaa99869171da606aff550f 100644 (file)
@@ -169,6 +169,33 @@ public:
     */
     wxCondError Wait();
 
+    /**
+        Waits until the condition is signalled and the associated condition true.
+
+        This is a convenience overload that may be used to ignore spurious
+        awakenings while waiting for a specific condition to become true.
+
+        Equivalent to
+        @code
+        while ( !predicate() )
+        {
+            wxCondError e = Wait();
+            if ( e != wxCOND_NO_ERROR )
+                return e;
+        }
+        return wxCOND_NO_ERROR;
+        @endcode
+
+        The predicate would typically be a C++11 lambda:
+        @code
+        condvar.Wait([]{return value == 1;});
+        @endcode
+
+        @since 3.0
+    */
+    template<typename Functor>
+    wxCondError Wait(const Functor& predicate);
+
     /**
         Waits until the condition is signalled or the timeout has elapsed.