From 57d6668e55c690d42da438eecde2e7e3a9ade5e7 Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 5 Apr 2019 10:20:48 +0100 Subject: [PATCH] Move metrics out of daemon into llarp::Context --- daemon/main.cpp | 16 ---------------- include/llarp.hpp | 26 ++++++++++++++++++++++---- llarp/context.cpp | 23 +++++++++++++++++++++-- 3 files changed, 43 insertions(+), 22 deletions(-) diff --git a/daemon/main.cpp b/daemon/main.cpp index f990a598c..9355a99df 100644 --- a/daemon/main.cpp +++ b/daemon/main.cpp @@ -3,9 +3,6 @@ #include #include #include -#include -#include -#include #include #include @@ -252,23 +249,10 @@ main(int argc, char *argv[]) signal(SIGHUP, handle_signal); #endif - llarp::thread::Scheduler scheduler; - llarp::metrics::DefaultManagerGuard metricsGuard; - llarp::metrics::PublisherScheduler publisherScheduler( - scheduler, metricsGuard.instance()); - metricsGuard.instance()->addGlobalPublisher( - std::make_shared< llarp::metrics::StreamPublisher >(std::cerr)); - - publisherScheduler.setDefault(absl::Seconds(30)); - - scheduler.start(); - code = llarp_main_setup(ctx); if(code == 0) code = llarp_main_run(ctx); llarp_main_free(ctx); - - scheduler.stop(); } #ifdef _WIN32 ::WSACleanup(); diff --git a/include/llarp.hpp b/include/llarp.hpp index b971402d2..9c06ed94f 100644 --- a/include/llarp.hpp +++ b/include/llarp.hpp @@ -21,17 +21,35 @@ namespace llarp struct AbstractRouter; struct RouterContact; + namespace metrics + { + class DefaultManagerGuard; + class PublisherScheduler; + } // namespace metrics + + namespace thread + { + class Scheduler; + } + struct Context { + Context(); ~Context(); + // These come first, in this order. + // This ensures we get metric collection on shutdown + std::unique_ptr< thread::Scheduler > m_scheduler; + std::unique_ptr< metrics::DefaultManagerGuard > m_metricsManager; + std::unique_ptr< metrics::PublisherScheduler > m_metricsPublisher; + int num_nethreads = 1; bool singleThreaded = false; - std::unique_ptr< llarp::Crypto > crypto; - std::unique_ptr< llarp::AbstractRouter > router; + std::unique_ptr< Crypto > crypto; + std::unique_ptr< AbstractRouter > router; std::unique_ptr< llarp_threadpool > worker; - std::unique_ptr< llarp::Logic > logic; - std::unique_ptr< llarp::Config > config; + std::unique_ptr< Logic > logic; + std::unique_ptr< Config > config; std::unique_ptr< llarp_nodedb > nodedb; std::unique_ptr< llarp_ev_loop > mainloop; std::string nodedb_dir; diff --git a/llarp/context.cpp b/llarp/context.cpp index c86671f75..6347580a3 100644 --- a/llarp/context.cpp +++ b/llarp/context.cpp @@ -10,6 +10,9 @@ #include #include #include +#include +#include +#include #include #include @@ -22,10 +25,26 @@ namespace llarp { + Context::Context() + : m_scheduler(std::make_unique< thread::Scheduler >()) + , m_metricsManager(std::make_unique< metrics::DefaultManagerGuard >()) + , m_metricsPublisher(std::make_unique< metrics::PublisherScheduler >( + *m_scheduler, m_metricsManager->instance())) + { + m_metricsManager->instance()->addGlobalPublisher( + std::make_shared< llarp::metrics::StreamPublisher >(std::cerr)); + + m_metricsPublisher->setDefault(absl::Seconds(30)); + + m_scheduler->start(); + } + Context::~Context() { llarp_ev_loop *ptr = mainloop.release(); llarp_ev_loop_free(&ptr); + + m_scheduler->stop(); } void @@ -339,8 +358,8 @@ extern "C" { cSetLogLevel(eLogDebug); } - llarp_main *m = new llarp_main; - m->ctx.reset(new llarp::Context()); + llarp_main *m = new llarp_main; + m->ctx = std::make_unique< llarp::Context >(); m->ctx->singleThreaded = !multiProcess; if(!m->ctx->LoadConfig(fname)) {