From 9ba1fff29e4794615c599e59ef453848a9bdb880 Mon Sep 17 00:00:00 2001 From: stickies-v Date: Mon, 28 Jul 2025 13:42:13 +0100 Subject: [PATCH] kernel: refactor: ConnectTip to pass block pointer by value By passing by value, we can remove the need to allocate a new pointer if the callsite uses move semantics. In the process, simplify naming. --- src/validation.cpp | 24 +++++++++++++----------- src/validation.h | 7 ++++++- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/validation.cpp b/src/validation.cpp index b62691ca4c0..e339fa774f0 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -3145,7 +3145,12 @@ public: * * The block is added to connectTrace if connection succeeds. */ -bool Chainstate::ConnectTip(BlockValidationState& state, CBlockIndex* pindexNew, const std::shared_ptr& pblock, ConnectTrace& connectTrace, DisconnectedBlockTransactions& disconnectpool) +bool Chainstate::ConnectTip( + BlockValidationState& state, + CBlockIndex* pindexNew, + std::shared_ptr block_to_connect, + ConnectTrace& connectTrace, + DisconnectedBlockTransactions& disconnectpool) { AssertLockHeld(cs_main); if (m_mempool) AssertLockHeld(m_mempool->cs); @@ -3153,18 +3158,15 @@ bool Chainstate::ConnectTip(BlockValidationState& state, CBlockIndex* pindexNew, assert(pindexNew->pprev == m_chain.Tip()); // Read block from disk. const auto time_1{SteadyClock::now()}; - std::shared_ptr pthisBlock; - if (!pblock) { + if (!block_to_connect) { std::shared_ptr pblockNew = std::make_shared(); if (!m_blockman.ReadBlock(*pblockNew, *pindexNew)) { return FatalError(m_chainman.GetNotifications(), state, _("Failed to read block.")); } - pthisBlock = pblockNew; + block_to_connect = std::move(pblockNew); } else { LogDebug(BCLog::BENCH, " - Using cached block\n"); - pthisBlock = pblock; } - const CBlock& blockConnecting = *pthisBlock; // Apply the block atomically to the chain state. const auto time_2{SteadyClock::now()}; SteadyClock::time_point time_3; @@ -3174,9 +3176,9 @@ bool Chainstate::ConnectTip(BlockValidationState& state, CBlockIndex* pindexNew, Ticks(time_2 - time_1)); { CCoinsViewCache view(&CoinsTip()); - bool rv = ConnectBlock(blockConnecting, state, pindexNew, view); + bool rv = ConnectBlock(*block_to_connect, state, pindexNew, view); if (m_chainman.m_options.signals) { - m_chainman.m_options.signals->BlockChecked(blockConnecting, state); + m_chainman.m_options.signals->BlockChecked(*block_to_connect, state); } if (!rv) { if (state.IsInvalid()) @@ -3212,8 +3214,8 @@ bool Chainstate::ConnectTip(BlockValidationState& state, CBlockIndex* pindexNew, Ticks(m_chainman.time_chainstate) / m_chainman.num_blocks_total); // Remove conflicting transactions from the mempool.; if (m_mempool) { - m_mempool->removeForBlock(blockConnecting.vtx, pindexNew->nHeight); - disconnectpool.removeForBlock(blockConnecting.vtx); + m_mempool->removeForBlock(block_to_connect->vtx, pindexNew->nHeight); + disconnectpool.removeForBlock(block_to_connect->vtx); } // Update m_chain & related variables. m_chain.SetTip(*pindexNew); @@ -3239,7 +3241,7 @@ bool Chainstate::ConnectTip(BlockValidationState& state, CBlockIndex* pindexNew, m_chainman.MaybeCompleteSnapshotValidation(); } - connectTrace.BlockConnected(pindexNew, std::move(pthisBlock)); + connectTrace.BlockConnected(pindexNew, std::move(block_to_connect)); return true; } diff --git a/src/validation.h b/src/validation.h index c25dd2de2d9..acdd53cc2a2 100644 --- a/src/validation.h +++ b/src/validation.h @@ -787,7 +787,12 @@ public: protected: bool ActivateBestChainStep(BlockValidationState& state, CBlockIndex* pindexMostWork, const std::shared_ptr& pblock, bool& fInvalidFound, ConnectTrace& connectTrace) EXCLUSIVE_LOCKS_REQUIRED(cs_main, m_mempool->cs); - bool ConnectTip(BlockValidationState& state, CBlockIndex* pindexNew, const std::shared_ptr& pblock, ConnectTrace& connectTrace, DisconnectedBlockTransactions& disconnectpool) EXCLUSIVE_LOCKS_REQUIRED(cs_main, m_mempool->cs); + bool ConnectTip( + BlockValidationState& state, + CBlockIndex* pindexNew, + std::shared_ptr block_to_connect, + ConnectTrace& connectTrace, + DisconnectedBlockTransactions& disconnectpool) EXCLUSIVE_LOCKS_REQUIRED(cs_main, m_mempool->cs); void InvalidBlockFound(CBlockIndex* pindex, const BlockValidationState& state) EXCLUSIVE_LOCKS_REQUIRED(cs_main); CBlockIndex* FindMostWorkChain() EXCLUSIVE_LOCKS_REQUIRED(cs_main);