From 52302cc007778e69ec9748373be816d702f82785 Mon Sep 17 00:00:00 2001 From: mutouyun Date: Tue, 12 Feb 2019 13:22:49 +0800 Subject: [PATCH] add wait-if for waiter --- include/waiter.h | 7 ++++++- src/platform/waiter_linux.h | 4 +++- src/waiter.cpp | 8 ++++++++ 3 files changed, 17 insertions(+), 2 deletions(-) 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 7140006..138b7ec 100644 --- a/src/platform/waiter_linux.h +++ b/src/platform/waiter_linux.h @@ -199,7 +199,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(); }