diff --git a/include/waiter.h b/include/waiter.h index 0c3e074..c7e2ded 100644 --- a/include/waiter.h +++ b/include/waiter.h @@ -10,7 +10,7 @@ public: explicit waiter(char const * name); waiter(waiter&& rhs); - ~waiter(); + virtual ~waiter(); void swap(waiter& rhs); waiter& operator=(waiter rhs); @@ -22,9 +22,14 @@ public: void close(); bool wait(); + bool wait_if_pred(); + bool notify(); bool broadcast(); +protected: + virtual bool pred(); + private: class waiter_; waiter_* p_; diff --git a/src/platform/waiter_linux.h b/src/platform/waiter_linux.h index b97b73a..f107ab1 100644 --- a/src/platform/waiter_linux.h +++ b/src/platform/waiter_linux.h @@ -189,7 +189,9 @@ public: void broadcast(handle_t h) { if (h == invalid()) return; - sem_.post([this] { return counter_.load(std::memory_order_relaxed); }); + sem_.post([this] { + return counter_.load(std::memory_order_relaxed); + }); } }; diff --git a/src/waiter.cpp b/src/waiter.cpp index 411a128..8616064 100644 --- a/src/waiter.cpp +++ b/src/waiter.cpp @@ -67,6 +67,14 @@ bool waiter::wait() { return impl(p_)->w_.wait_if([] { return true; }); } +bool waiter::pred() { + return true; +} + +bool waiter::wait_if_pred() { + return impl(p_)->w_.wait_if([this] { return pred(); }); +} + bool waiter::notify() { return impl(p_)->w_.notify(); }