diff --git a/rai/node/node.cpp b/rai/node/node.cpp index 1c8925a1..cf11ade4 100755 --- a/rai/node/node.cpp +++ b/rai/node/node.cpp @@ -1102,22 +1102,13 @@ void rai::block_processor::process_blocks () { if (!blocks.empty ()) { - { - auto completed (blocks.front ().second); - std::vector > blocks_processing; - while (!blocks.empty () && blocks_processing.size () < rai::blocks_per_transaction) - { - auto info (blocks.front ()); - blocks_processing.push_back (info.first); - blocks.pop_front (); - } - // Move first blocks to the end of blocks_processing - std::reverse (blocks_processing.begin (), blocks_processing.end ()); - lock.unlock (); - process_receive_many (blocks_processing, completed); - } - // Let other threads get an opportunity to transaction lock - std::this_thread::yield (); + std::deque , std::function )>>> blocks_processing; + std::swap (blocks, blocks_processing); + lock.unlock (); + std::reverse (blocks_processing.begin (), blocks_processing.end ()); + process_receive_many (blocks_processing); + // Let other threads get an opportunity to transaction lock + std::this_thread::yield (); lock.lock (); } else @@ -1132,12 +1123,12 @@ void rai::block_processor::process_blocks () void rai::block_processor::process_receive_many (std::shared_ptr block_a, std::function )> completed_a) { - std::vector > blocks_processing; - blocks_processing.push_back (block_a); - process_receive_many (blocks_processing, completed_a); + std::deque , std::function )>>> blocks_processing; + blocks_processing.push_back (std::make_pair (block_a, completed_a)); + process_receive_many (blocks_processing); } -void rai::block_processor::process_receive_many (std::vector > blocks_processing, std::function )> completed_a) +void rai::block_processor::process_receive_many (std::deque , std::function )>>> & blocks_processing) { while (!blocks_processing.empty ()) { @@ -1147,16 +1138,16 @@ void rai::block_processor::process_receive_many (std::vector hash ()); - auto process_result (process_receive_one (transaction, block)); - completed_a (transaction, process_result, block); + auto hash (item.first->hash ()); + auto process_result (process_receive_one (transaction, item.first)); + item.second (transaction, process_result, item.first); switch (process_result.code) { case rai::process_result::progress: { - progress.push_back (std::make_pair (block, process_result)); + progress.push_back (std::make_pair (item.first, process_result)); } case rai::process_result::old: { @@ -1164,7 +1155,7 @@ void rai::block_processor::process_receive_many (std::vector ) {})); } std::lock_guard lock (node.gap_cache.mutex); node.gap_cache.blocks.get <1> ().erase (hash); diff --git a/rai/node/node.hpp b/rai/node/node.hpp index 3cb8de27..6dcd2f29 100644 --- a/rai/node/node.hpp +++ b/rai/node/node.hpp @@ -441,7 +441,7 @@ public: void flush (); void add (std::shared_ptr , std::function )> = [] (MDB_txn *, rai::process_return, std::shared_ptr ) {}); void process_receive_many (std::shared_ptr , std::function )> = [] (MDB_txn *, rai::process_return, std::shared_ptr ) {}); - void process_receive_many (std::vector >, std::function )> = [] (MDB_txn *, rai::process_return, std::shared_ptr ) {}); + void process_receive_many (std::deque , std::function )>>> &); rai::process_return process_receive_one (MDB_txn *, std::shared_ptr ); void process_blocks (); private: