mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-11-15 16:38:23 +01:00
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.
This commit is contained in:
@@ -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<const CBlock>& pblock, ConnectTrace& connectTrace, DisconnectedBlockTransactions& disconnectpool)
|
||||
bool Chainstate::ConnectTip(
|
||||
BlockValidationState& state,
|
||||
CBlockIndex* pindexNew,
|
||||
std::shared_ptr<const CBlock> 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<const CBlock> pthisBlock;
|
||||
if (!pblock) {
|
||||
if (!block_to_connect) {
|
||||
std::shared_ptr<CBlock> pblockNew = std::make_shared<CBlock>();
|
||||
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<MillisecondsDouble>(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<MillisecondsDouble>(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;
|
||||
}
|
||||
|
||||
|
||||
@@ -787,7 +787,12 @@ public:
|
||||
|
||||
protected:
|
||||
bool ActivateBestChainStep(BlockValidationState& state, CBlockIndex* pindexMostWork, const std::shared_ptr<const CBlock>& pblock, bool& fInvalidFound, ConnectTrace& connectTrace) EXCLUSIVE_LOCKS_REQUIRED(cs_main, m_mempool->cs);
|
||||
bool ConnectTip(BlockValidationState& state, CBlockIndex* pindexNew, const std::shared_ptr<const CBlock>& pblock, ConnectTrace& connectTrace, DisconnectedBlockTransactions& disconnectpool) EXCLUSIVE_LOCKS_REQUIRED(cs_main, m_mempool->cs);
|
||||
bool ConnectTip(
|
||||
BlockValidationState& state,
|
||||
CBlockIndex* pindexNew,
|
||||
std::shared_ptr<const CBlock> 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);
|
||||
|
||||
Reference in New Issue
Block a user