diff --git a/nano/node/blockprocessor.cpp b/nano/node/blockprocessor.cpp index 92efa88e2..b9f8544d7 100644 --- a/nano/node/blockprocessor.cpp +++ b/nano/node/blockprocessor.cpp @@ -46,9 +46,21 @@ nano::block_processor::block_processor (nano::node & node_a, nano::write_databas block_processed.notify (result, context); } }); - processing_thread = std::thread ([this] () { +} + +nano::block_processor::~block_processor () +{ + // Thread must be stopped before destruction + debug_assert (!thread.joinable ()); +} + +void nano::block_processor::start () +{ + debug_assert (!thread.joinable ()); + + thread = std::thread ([this] () { nano::thread_role::set (nano::thread_role::name::block_processing); - this->process_blocks (); + run (); }); } @@ -59,7 +71,10 @@ void nano::block_processor::stop () stopped = true; } condition.notify_all (); - nano::join_or_pass (processing_thread); + if (thread.joinable ()) + { + thread.join (); + } } std::size_t nano::block_processor::size () @@ -172,14 +187,13 @@ void nano::block_processor::rollback_competitor (store::write_transaction const } } -void nano::block_processor::process_blocks () +void nano::block_processor::run () { nano::unique_lock lock{ mutex }; while (!stopped) { if (have_blocks_ready ()) { - active = true; lock.unlock (); auto processed = process_batch (lock); @@ -194,7 +208,6 @@ void nano::block_processor::process_blocks () batch_processed.notify (processed); lock.lock (); - active = false; } else { diff --git a/nano/node/blockprocessor.hpp b/nano/node/blockprocessor.hpp index f0dae027c..0d020e8b1 100644 --- a/nano/node/blockprocessor.hpp +++ b/nano/node/blockprocessor.hpp @@ -67,8 +67,11 @@ public: // Context public: block_processor (nano::node &, nano::write_database_queue &); + ~block_processor (); + void start (); void stop (); + std::size_t size (); bool full (); bool half_full (); @@ -78,7 +81,7 @@ public: bool should_log (); bool have_blocks_ready (); bool have_blocks (); - void process_blocks (); + std::unique_ptr collect_container_info (std::string const & name); std::atomic flushing{ false }; @@ -93,6 +96,7 @@ public: // Events nano::observer_set const &> rolled_back; private: + void run (); // Roll back block in the ledger that conflicts with 'block' void rollback_competitor (store::write_transaction const &, nano::block const & block); nano::block_status process_one (store::write_transaction const &, context const &, bool forced = false); @@ -106,15 +110,14 @@ private: // Dependencies nano::write_database_queue & write_database_queue; private: - bool stopped{ false }; - bool active{ false }; - std::deque blocks; std::deque forced; std::chrono::steady_clock::time_point next_log; + + bool stopped{ false }; nano::condition_variable condition; nano::mutex mutex{ mutex_identifier (mutexes::block_processor) }; - std::thread processing_thread; + std::thread thread; }; } diff --git a/nano/node/node.cpp b/nano/node/node.cpp index 0a49c4c74..033a98860 100644 --- a/nano/node/node.cpp +++ b/nano/node/node.cpp @@ -635,6 +635,7 @@ void nano::node::start () } wallets.start (); vote_processor.start (); + block_processor.start (); active.start (); generator.start (); final_generator.start ();