diff --git a/src/bench/checkqueue.cpp b/src/bench/checkqueue.cpp index 8134154eb11..7255b4f1376 100644 --- a/src/bench/checkqueue.cpp +++ b/src/bench/checkqueue.cpp @@ -56,7 +56,7 @@ static void CCheckQueueSpeedPrevectorJob(benchmark::Bench& bench) bench.minEpochIterations(10).batch(BATCH_SIZE * BATCHES).unit("job").run([&] { // Make insecure_rand here so that each iteration is identical. - CCheckQueueControl control(&queue); + CCheckQueueControl control(queue); for (auto vChecks : vBatches) { control.Add(std::move(vChecks)); } diff --git a/src/checkqueue.h b/src/checkqueue.h index 934f672ae39..e9eb96034cb 100644 --- a/src/checkqueue.h +++ b/src/checkqueue.h @@ -208,43 +208,35 @@ template ( class CCheckQueueControl { private: - CCheckQueue * const pqueue; + CCheckQueue& m_queue; bool fDone; public: CCheckQueueControl() = delete; CCheckQueueControl(const CCheckQueueControl&) = delete; CCheckQueueControl& operator=(const CCheckQueueControl&) = delete; - explicit CCheckQueueControl(CCheckQueue * const pqueueIn) : pqueue(pqueueIn), fDone(false) + explicit CCheckQueueControl(CCheckQueue& queueIn) : m_queue(queueIn), fDone(false) { - // passed queue is supposed to be unused, or nullptr - if (pqueue != nullptr) { - ENTER_CRITICAL_SECTION(pqueue->m_control_mutex); - } + ENTER_CRITICAL_SECTION(m_queue.m_control_mutex); } std::optional Complete() { - if (pqueue == nullptr) return std::nullopt; - auto ret = pqueue->Complete(); + auto ret = m_queue.Complete(); fDone = true; return ret; } void Add(std::vector&& vChecks) { - if (pqueue != nullptr) { - pqueue->Add(std::move(vChecks)); - } + m_queue.Add(std::move(vChecks)); } ~CCheckQueueControl() { if (!fDone) Complete(); - if (pqueue != nullptr) { - LEAVE_CRITICAL_SECTION(pqueue->m_control_mutex); - } + LEAVE_CRITICAL_SECTION(m_queue.m_control_mutex); } }; diff --git a/src/test/checkqueue_tests.cpp b/src/test/checkqueue_tests.cpp index 2463ce6da56..da9c3aa85d8 100644 --- a/src/test/checkqueue_tests.cpp +++ b/src/test/checkqueue_tests.cpp @@ -165,7 +165,7 @@ void CheckQueueTest::Correct_Queue_range(std::vector range) for (const size_t i : range) { size_t total = i; FakeCheckCheckCompletion::n_calls = 0; - CCheckQueueControl control(small_queue.get()); + CCheckQueueControl control(*small_queue); while (total) { vChecks.clear(); vChecks.resize(std::min(total, m_rng.randrange(10))); @@ -220,7 +220,7 @@ BOOST_AUTO_TEST_CASE(test_CheckQueue_Catches_Failure) { auto fixed_queue = std::make_unique(QUEUE_BATCH_SIZE, SCRIPT_CHECK_THREADS); for (size_t i = 0; i < 1001; ++i) { - CCheckQueueControl control(fixed_queue.get()); + CCheckQueueControl control(*fixed_queue); size_t remaining = i; while (remaining) { size_t r = m_rng.randrange(10); @@ -246,7 +246,7 @@ BOOST_AUTO_TEST_CASE(test_CheckQueue_Recovers_From_Failure) auto fail_queue = std::make_unique(QUEUE_BATCH_SIZE, SCRIPT_CHECK_THREADS); for (auto times = 0; times < 10; ++times) { for (const bool end_fails : {true, false}) { - CCheckQueueControl control(fail_queue.get()); + CCheckQueueControl control(*fail_queue); { std::vector vChecks; vChecks.resize(100, FixedCheck(std::nullopt)); @@ -268,7 +268,7 @@ BOOST_AUTO_TEST_CASE(test_CheckQueue_UniqueCheck) size_t COUNT = 100000; size_t total = COUNT; { - CCheckQueueControl control(queue.get()); + CCheckQueueControl control(*queue); while (total) { size_t r = m_rng.randrange(10); std::vector vChecks; @@ -300,7 +300,7 @@ BOOST_AUTO_TEST_CASE(test_CheckQueue_Memory) for (size_t i = 0; i < 1000; ++i) { size_t total = i; { - CCheckQueueControl control(queue.get()); + CCheckQueueControl control(*queue); while (total) { size_t r = m_rng.randrange(10); std::vector vChecks; @@ -324,7 +324,7 @@ BOOST_AUTO_TEST_CASE(test_CheckQueue_FrozenCleanup) auto queue = std::make_unique(QUEUE_BATCH_SIZE, SCRIPT_CHECK_THREADS); bool fails = false; std::thread t0([&]() { - CCheckQueueControl control(queue.get()); + CCheckQueueControl control(*queue); std::vector vChecks(1); control.Add(std::move(vChecks)); auto result = control.Complete(); // Hangs here @@ -364,7 +364,7 @@ BOOST_AUTO_TEST_CASE(test_CheckQueueControl_Locks) for (size_t i = 0; i < 3; ++i) { tg.emplace_back( [&]{ - CCheckQueueControl control(queue.get()); + CCheckQueueControl control(*queue); // While sleeping, no other thread should execute to this point auto observed = ++nThreads; UninterruptibleSleep(std::chrono::milliseconds{10}); @@ -387,7 +387,7 @@ BOOST_AUTO_TEST_CASE(test_CheckQueueControl_Locks) { std::unique_lock l(m); tg.emplace_back([&]{ - CCheckQueueControl control(queue.get()); + CCheckQueueControl control(*queue); std::unique_lock ll(m); has_lock = true; cv.notify_one(); diff --git a/src/test/fuzz/checkqueue.cpp b/src/test/fuzz/checkqueue.cpp index 6b93886c711..e053fa618d4 100644 --- a/src/test/fuzz/checkqueue.cpp +++ b/src/test/fuzz/checkqueue.cpp @@ -49,7 +49,7 @@ FUZZ_TARGET(checkqueue) (void)check_queue_1.Complete(); } - CCheckQueueControl check_queue_control{&check_queue_2}; + CCheckQueueControl check_queue_control{check_queue_2}; if (fuzzed_data_provider.ConsumeBool()) { check_queue_control.Add(std::move(checks_2)); } diff --git a/src/test/transaction_tests.cpp b/src/test/transaction_tests.cpp index 1375672a418..7a60ea25d3f 100644 --- a/src/test/transaction_tests.cpp +++ b/src/test/transaction_tests.cpp @@ -568,7 +568,7 @@ BOOST_AUTO_TEST_CASE(test_big_witness_transaction) // check all inputs concurrently, with the cache PrecomputedTransactionData txdata(tx); CCheckQueue scriptcheckqueue(/*batch_size=*/128, /*worker_threads_num=*/20); - CCheckQueueControl control(&scriptcheckqueue); + CCheckQueueControl control(scriptcheckqueue); std::vector coins; for(uint32_t i = 0; i < mtx.vin.size(); i++) { diff --git a/src/validation.cpp b/src/validation.cpp index c69a9959121..d8e4bdfb7ef 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -2612,7 +2612,7 @@ bool Chainstate::ConnectBlock(const CBlock& block, BlockValidationState& state, // doesn't invalidate pointers into the vector, and keep txsdata in scope // for as long as `control`. std::optional> control; - if (fScriptChecks && parallel_script_checks) control.emplace(&m_chainman.GetCheckQueue()); + if (fScriptChecks && parallel_script_checks) control.emplace(m_chainman.GetCheckQueue()); std::vector txsdata(block.vtx.size());