From 3207f6413c15edc91e46c9cd154a84c93c78bbc8 Mon Sep 17 00:00:00 2001 From: Xuehan Xu Date: Wed, 1 Sep 2021 15:33:02 +0800 Subject: [PATCH] crimson/common: a new condition variable Signed-off-by: Xuehan Xu --- src/crimson/common/condition_variable.h | 43 +++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/crimson/common/condition_variable.h diff --git a/src/crimson/common/condition_variable.h b/src/crimson/common/condition_variable.h new file mode 100644 index 0000000000000..19267f38abeaf --- /dev/null +++ b/src/crimson/common/condition_variable.h @@ -0,0 +1,43 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:nil -*- +// vim: ts=8 sw=2 smarttab + +#pragma once + +#include +#include +#include + +#include "crimson/common/interruptible_future.h" + +namespace crimson { + +class condition_variable : public seastar::condition_variable { +public: + template + auto wait( + Pred&& pred, + Func&& action) noexcept { + using func_result_t = std::invoke_result_t; + using intr_errorator_t = typename func_result_t::interrupt_errorator_type; + using intr_cond_t = typename func_result_t::interrupt_cond_type; + using interruptor = crimson::interruptible::interruptor; + return interruptor::repeat( + [this, pred=std::forward(pred), + action=std::forward(action)]() + -> typename intr_errorator_t::template future { + if (!pred()) { + return seastar::condition_variable::wait().then([] { + return seastar::make_ready_future< + seastar::stop_iteration>(seastar::stop_iteration::no); + }); + } else { + return action().si_then([] { + return seastar::make_ready_future< + seastar::stop_iteration>(seastar::stop_iteration::yes); + }); + } + }); + } +}; + +} // namespace crimson -- 2.39.5