diff --git a/nano/node/node.cpp b/nano/node/node.cpp index a7115d15bd..d43147ba77 100644 --- a/nano/node/node.cpp +++ b/nano/node/node.cpp @@ -674,6 +674,7 @@ void nano::node::start () { port_mapping.start (); } + unchecked.start (); wallets.start (); rep_tiers.start (); vote_processor.start (); diff --git a/nano/node/unchecked_map.cpp b/nano/node/unchecked_map.cpp index 4d65a40d2f..88e3cdb96f 100644 --- a/nano/node/unchecked_map.cpp +++ b/nano/node/unchecked_map.cpp @@ -9,15 +9,37 @@ nano::unchecked_map::unchecked_map (unsigned const max_unchecked_blocks, nano::stats & stats, bool const & disable_delete) : max_unchecked_blocks{ max_unchecked_blocks }, stats{ stats }, - disable_delete{ disable_delete }, - thread{ [this] () { run (); } } + disable_delete{ disable_delete } { } nano::unchecked_map::~unchecked_map () { - stop (); - thread.join (); + debug_assert (!thread.joinable ()); +} + +void nano::unchecked_map::start () +{ + debug_assert (!thread.joinable ()); + + thread = std::thread ([this] () { + nano::thread_role::set (nano::thread_role::name::unchecked); + run (); + }); +} + +void nano::unchecked_map::stop () +{ + { + nano::lock_guard lock{ mutex }; + stopped = true; + } + condition.notify_all (); + + if (thread.joinable ()) + { + thread.join (); + } } void nano::unchecked_map::put (nano::hash_or_account const & dependency, nano::unchecked_info const & info) @@ -30,6 +52,7 @@ void nano::unchecked_map::put (nano::hash_or_account const & dependency, nano::u { entries.get ().pop_front (); } + stats.inc (nano::stat::type::unchecked, nano::stat::detail::put); } @@ -85,24 +108,6 @@ std::size_t nano::unchecked_map::count () const return entries.size (); } -void nano::unchecked_map::stop () -{ - nano::unique_lock lock{ mutex }; - if (!stopped) - { - stopped = true; - condition.notify_all (); // Notify flush (), run () - } -} - -void nano::unchecked_map::flush () -{ - nano::unique_lock lock{ mutex }; - condition.wait (lock, [this] () { - return stopped || (buffer.empty () && back_buffer.empty () && !writing_back_buffer); - }); -} - void nano::unchecked_map::trigger (nano::hash_or_account const & dependency) { nano::unique_lock lock{ mutex }; @@ -122,7 +127,6 @@ void nano::unchecked_map::process_queries (decltype (buffer) const & back_buffer void nano::unchecked_map::run () { - nano::thread_role::set (nano::thread_role::name::unchecked); nano::unique_lock lock{ mutex }; while (!stopped) { @@ -138,7 +142,6 @@ void nano::unchecked_map::run () } else { - condition.notify_all (); // Notify flush () condition.wait (lock, [this] () { return stopped || !buffer.empty (); }); diff --git a/nano/node/unchecked_map.hpp b/nano/node/unchecked_map.hpp index 9a548c203d..b6c904d4be 100644 --- a/nano/node/unchecked_map.hpp +++ b/nano/node/unchecked_map.hpp @@ -25,6 +25,9 @@ class unchecked_map unchecked_map (unsigned const max_unchecked_blocks, nano::stats &, bool const & do_delete); ~unchecked_map (); + void start (); + void stop (); + void put (nano::hash_or_account const & dependency, nano::unchecked_info const & info); void for_each ( std::function action, std::function predicate = [] () { return true; }); @@ -35,8 +38,6 @@ class unchecked_map void del (nano::unchecked_key const & key); void clear (); std::size_t count () const; - void stop (); - void flush (); /** * Trigger requested dependencies @@ -58,10 +59,12 @@ class unchecked_map std::deque buffer; std::deque back_buffer; bool writing_back_buffer{ false }; + bool stopped{ false }; nano::condition_variable condition; nano::mutex mutex; std::thread thread; + unsigned const max_unchecked_blocks; void process_queries (decltype (buffer) const & back_buffer);