From 2b6ee636cacc4a560c35deac109fa05f63d27d8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20W=C3=B3jcik?= <3044353+pwojcikdev@users.noreply.github.com> Date: Mon, 15 Apr 2024 10:04:52 +0200 Subject: [PATCH] Constexpr check NANO_ASIO_HANDLER_TRACKING (#4562) --- nano/lib/thread_runner.cpp | 38 +++++++++++++++++++------------------ nano/lib/thread_runner.hpp | 11 ++++++++++- nano/test_common/system.cpp | 27 ++++++++++++++------------ 3 files changed, 45 insertions(+), 31 deletions(-) diff --git a/nano/lib/thread_runner.cpp b/nano/lib/thread_runner.cpp index 62a7625cd1..5f36c82a82 100644 --- a/nano/lib/thread_runner.cpp +++ b/nano/lib/thread_runner.cpp @@ -24,7 +24,7 @@ nano::thread_runner::thread_runner (std::shared_ptr io_ try { logger.debug (nano::log::type::thread_runner, "Thread #{} ({}) started", i, to_string (role)); - run (*io_ctx); + run (); logger.debug (nano::log::type::thread_runner, "Thread #{} ({}) stopped", i, to_string (role)); } catch (std::exception const & ex) @@ -49,28 +49,30 @@ nano::thread_runner::~thread_runner () join (); } -void nano::thread_runner::run (boost::asio::io_context & io_ctx_a) +void nano::thread_runner::run () { -#if NANO_ASIO_HANDLER_TRACKING == 0 - io_ctx_a.run (); -#else - nano::timer<> timer; - timer.start (); - while (true) + if constexpr (nano::asio_handler_tracking_threshold () == 0) { - timer.restart (); - // Run at most 1 completion handler and record the time it took to complete (non-blocking) - auto count = io_ctx_a.poll_one (); - if (count == 1 && timer.since_start ().count () >= NANO_ASIO_HANDLER_TRACKING) + io_ctx->run (); + } + else + { + nano::timer<> timer; + timer.start (); + while (true) { - auto timestamp = std::chrono::duration_cast (std::chrono::system_clock::now ().time_since_epoch ()).count (); - std::cout << (boost::format ("[%1%] io_thread held for %2%ms") % timestamp % timer.since_start ().count ()).str () << std::endl; + timer.restart (); + // Run at most 1 completion handler and record the time it took to complete (non-blocking) + auto count = io_ctx->poll_one (); + if (count == 1 && timer.since_start ().count () >= nano::asio_handler_tracking_threshold ()) + { + logger.warn (nano::log::type::system, "Async handler processing took too long: {}ms", timer.since_start ().count ()); + } + // Sleep for a bit to give more time slices to other threads + std::this_thread::sleep_for (std::chrono::milliseconds (5)); + std::this_thread::yield (); } - // Sleep for a bit to give more time slices to other threads - std::this_thread::sleep_for (std::chrono::milliseconds (5)); - std::this_thread::yield (); } -#endif } void nano::thread_runner::join () diff --git a/nano/lib/thread_runner.hpp b/nano/lib/thread_runner.hpp index 116a1aa65b..f1d557a883 100644 --- a/nano/lib/thread_runner.hpp +++ b/nano/lib/thread_runner.hpp @@ -31,6 +31,15 @@ class thread_runner final std::vector threads; private: - void run (boost::asio::io_context &); + void run (); }; + +constexpr unsigned asio_handler_tracking_threshold () +{ +#if NANO_ASIO_HANDLER_TRACKING == 0 + return 0; +#else + return NANO_ASIO_HANDLER_TRACKING; +#endif +} } // namespace nano diff --git a/nano/test_common/system.cpp b/nano/test_common/system.cpp index d5bc43b1d0..fda7ffbc8b 100644 --- a/nano/test_common/system.cpp +++ b/nano/test_common/system.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -335,22 +336,24 @@ void nano::test::system::deadline_set (std::chrono::duration std::error_code nano::test::system::poll (std::chrono::nanoseconds const & wait_time) { -#if NANO_ASIO_HANDLER_TRACKING == 0 - io_ctx->run_one_for (wait_time); -#else - nano::timer<> timer; - timer.start (); - auto count = io_ctx.poll_one (); - if (count == 0) + if constexpr (nano::asio_handler_tracking_threshold () == 0) { - std::this_thread::sleep_for (wait_time); + io_ctx->run_one_for (wait_time); } - else if (count == 1 && timer.since_start ().count () >= NANO_ASIO_HANDLER_TRACKING) + else { - auto timestamp = std::chrono::duration_cast (std::chrono::system_clock::now ().time_since_epoch ()).count (); - std::cout << (boost::format ("[%1%] io_thread held for %2%ms") % timestamp % timer.since_start ().count ()).str () << std::endl; + nano::timer<> timer; + timer.start (); + auto count = io_ctx->poll_one (); + if (count == 0) + { + std::this_thread::sleep_for (wait_time); + } + else if (count == 1 && timer.since_start ().count () >= nano::asio_handler_tracking_threshold ()) + { + logger.warn (nano::log::type::system, "Async handler processing took too long: {}ms", timer.since_start ().count ()); + } } -#endif std::error_code ec; if (std::chrono::steady_clock::now () > deadline)