From 4c8c90b5567a3f31444bf0b151c3109e85ac2329 Mon Sep 17 00:00:00 2001 From: Cory Fields Date: Tue, 6 May 2025 14:43:38 +0000 Subject: [PATCH] validation: only create a CCheckQueueControl if it's actually going to be used This will allow CCheckQueueControl to require a CCheckQueue. --- src/validation.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/validation.cpp b/src/validation.cpp index 5ad2ebdcd7e..c69a9959121 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -2611,7 +2611,9 @@ bool Chainstate::ConnectBlock(const CBlock& block, BlockValidationState& state, // in multiple threads). Preallocate the vector size so a new allocation // doesn't invalidate pointers into the vector, and keep txsdata in scope // for as long as `control`. - CCheckQueueControl control(fScriptChecks && parallel_script_checks ? &m_chainman.GetCheckQueue() : nullptr); + std::optional> control; + if (fScriptChecks && parallel_script_checks) control.emplace(&m_chainman.GetCheckQueue()); + std::vector txsdata(block.vtx.size()); std::vector prevheights; @@ -2680,7 +2682,7 @@ bool Chainstate::ConnectBlock(const CBlock& block, BlockValidationState& state, tx_state.GetRejectReason(), tx_state.GetDebugMessage()); break; } - control.Add(std::move(vChecks)); + if (control) control->Add(std::move(vChecks)); } CTxUndo undoDummy; @@ -2702,10 +2704,11 @@ bool Chainstate::ConnectBlock(const CBlock& block, BlockValidationState& state, state.Invalid(BlockValidationResult::BLOCK_CONSENSUS, "bad-cb-amount", strprintf("coinbase pays too much (actual=%d vs limit=%d)", block.vtx[0]->GetValueOut(), blockReward)); } - - auto parallel_result = control.Complete(); - if (parallel_result.has_value() && state.IsValid()) { - state.Invalid(BlockValidationResult::BLOCK_CONSENSUS, strprintf("mandatory-script-verify-flag-failed (%s)", ScriptErrorString(parallel_result->first)), parallel_result->second); + if (control) { + auto parallel_result = control->Complete(); + if (parallel_result.has_value() && state.IsValid()) { + state.Invalid(BlockValidationResult::BLOCK_CONSENSUS, strprintf("mandatory-script-verify-flag-failed (%s)", ScriptErrorString(parallel_result->first)), parallel_result->second); + } } if (!state.IsValid()) { LogInfo("Block validation error: %s", state.ToString());