From daa09aff863715b4b56083544a9977e9239970ae Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Wed, 11 Oct 2023 20:32:18 -0400 Subject: [PATCH] reactor: auto-initialization hooks --- include/xo/reactor/Reactor.hpp | 3 +++ include/xo/reactor/init_reactor.hpp | 12 ++++----- src/reactor/Reactor.cpp | 40 ++++++++++++++++++----------- utest/PollingReactor.test.cpp | 7 +++++ 4 files changed, 41 insertions(+), 21 deletions(-) diff --git a/include/xo/reactor/Reactor.hpp b/include/xo/reactor/Reactor.hpp index 453312a4..2b265b0b 100644 --- a/include/xo/reactor/Reactor.hpp +++ b/include/xo/reactor/Reactor.hpp @@ -61,6 +61,9 @@ namespace xo { */ void run() { this->run_n(-1); } + protected: + Reactor(); + private: /* control logging verbosity */ log_level loglevel_; diff --git a/include/xo/reactor/init_reactor.hpp b/include/xo/reactor/init_reactor.hpp index 5977d7ad..3e5e51bb 100644 --- a/include/xo/reactor/init_reactor.hpp +++ b/include/xo/reactor/init_reactor.hpp @@ -8,13 +8,13 @@ #include "xo/subsys/Subsystem.hpp" namespace xo { - enum S_reactor_tag {}; + enum S_reactor_tag {}; - template<> - struct InitSubsys { - static void init(); - static InitEvidence require(); - }; + template<> + struct InitSubsys { + static void init(); + static InitEvidence require(); + }; } /*namespace xo*/ /* end init_reactor.hpp */ diff --git a/src/reactor/Reactor.cpp b/src/reactor/Reactor.cpp index 2ef80e46..199ec562 100644 --- a/src/reactor/Reactor.cpp +++ b/src/reactor/Reactor.cpp @@ -4,23 +4,33 @@ */ #include "Reactor.hpp" +#include "init_reactor.hpp" +#include "xo/subsys/Subsystem.hpp" namespace xo { - namespace reactor { - void - Reactor::run_n(int32_t n) - { - if (n == -1) { - for (;;) { - this->run_one(); - } - } else { - for (int32_t i=0; irun_one(); - } - } - } /*run_n*/ - } /*namespace reactor*/ + namespace reactor { + Reactor::Reactor() { + /* ensure reactor subsystem + deps initialized */ + + InitSubsys::require(); + + Subsystem::initialize_all(); + } + + void + Reactor::run_n(int32_t n) + { + if (n == -1) { + for (;;) { + this->run_one(); + } + } else { + for (int32_t i=0; irun_one(); + } + } + } /*run_n*/ + } /*namespace reactor*/ } /*namespace xo*/ /* end Reactor.cpp */ diff --git a/utest/PollingReactor.test.cpp b/utest/PollingReactor.test.cpp index 39845264..97d679cb 100644 --- a/utest/PollingReactor.test.cpp +++ b/utest/PollingReactor.test.cpp @@ -1,5 +1,6 @@ /* @file PollingReactor.test.cpp */ +#include "xo/reactor/init_reactor.hpp" #include "xo/reactor/PollingReactor.hpp" #include "xo/reactor/FifoQueue.hpp" #include "xo/reactor/Sink.hpp" @@ -57,8 +58,12 @@ namespace xo { } } /*namespace*/ + static InitEvidence s_evidence = InitSubsys::require(); + namespace ut { TEST_CASE("polling0", "[reactor]") { + Subsystem::initialize_all(); + rp reactor = PollingReactor::make(); REQUIRE(reactor.get()); @@ -193,6 +198,8 @@ namespace xo { } /*run_polling1_test*/ TEST_CASE("polling1", "[reactor]") { + Subsystem::initialize_all(); + //log_config::style = function_style::streamlined; log_config::location_tab = 100;