From ceee1c4b3bafae08d54c97d6b18ab3edf0dd519a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=A1clav=20Slav=C3=ADk?= Date: Fri, 6 Sep 2013 17:09:05 +0000 Subject: [PATCH] Add wxCondition::Wait() overload that also tests the condition. 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 | 13 +++++++++++++ interface/wx/thread.h | 27 +++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/include/wx/thread.h b/include/wx/thread.h index 796a7dd188..086007f826 100644 --- a/include/wx/thread.h +++ b/include/wx/thread.h @@ -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 + 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 diff --git a/interface/wx/thread.h b/interface/wx/thread.h index 5ec3a58a8c..61becf5847 100644 --- a/interface/wx/thread.h +++ b/interface/wx/thread.h @@ -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 + wxCondError Wait(const Functor& predicate); + /** Waits until the condition is signalled or the timeout has elapsed.