10 #include <log4cplus/loggingmacros.h>
11 #include <fmt/format.h>
12 #include <fmt/ostream.h>
21 std::shared_ptr<ObservableStatus> status,
23 std::chrono::milliseconds timeout)
25 , m_status(std::move(status))
30 , m_logger(log4cplus::Logger::getInstance(
"daq.op.awaitstate")) {
36 if (IsConditionSatisfied()) {
38 return boost::make_ready_future<ResultType>(
ResultType{
false, m_status->GetStatus()});
44 if (IsConditionSatisfied()) {
45 LOG4CPLUS_DEBUG(m_logger,
47 "Await condition is satisfied by status change "
48 "-> setting promise: ",
51 m_promise.set_value(
ResultType{
false, m_status->GetStatus()});
53 }
catch (boost::promise_already_satisfied
const&) {
55 LOG4CPLUS_DEBUG(m_logger,
"Promise already satisfied");
60 m_timer.expires_after(m_timeout);
61 m_timer.async_wait([
this](boost::system::error_code
const& error) {
64 LOG4CPLUS_DEBUG(
"daq.op.awaitstate",
"Timer cancelled: Doing nothing.");
69 LOG4CPLUS_INFO(
"daq.op.awaitstate",
"Operation aborted: Doing nothing.");
74 bool timeout = !IsConditionSatisfied();
77 fmt::format(
"AwaitStateAsync: {}: Timer cb waiting for target state {}. "
78 "Current state is {}",
81 m_status->GetState()));
82 m_promise.set_value(
ResultType{timeout, m_status->GetStatus()});
83 }
catch (boost::promise_already_satisfied
const&) {
85 LOG4CPLUS_DEBUG(m_logger,
"Promise already satisfied");
89 return m_promise.get_future();
95 LOG4CPLUS_INFO(
"daq.op.awaitstate",
"Aborting operation.");
97 fmt::format(
"AwaitStateAsync: {}: Operation aborted while waiting for target state {}. "
98 "Current state is {}",
101 m_status->GetState())));
105 m_connection.disconnect();
106 }
catch (boost::promise_already_satisfied
const&) {
111 bool AwaitStateAsync::IsConditionSatisfied()
const {