From d6f680b4275296e4a7f9e6ea693149e59800e495 Mon Sep 17 00:00:00 2001 From: sedited Date: Sat, 28 Feb 2026 12:13:53 +0100 Subject: [PATCH] validation: Move block into BlockDisconnected signal This makes existing behaviour of the block's destructor triggering on the scheduler thread more explicit by moving it to the thread. The scheduler thread doing so is useful, since it does not block the thread doing validation while releasing a block's memory. DisconnectTip already creates and destroys the block itself, so moving it into the validation signals is well scoped. --- src/validation.cpp | 2 +- src/validationinterface.cpp | 4 ++-- src/validationinterface.h | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/validation.cpp b/src/validation.cpp index f9cc7d78e1b..00c1bab501f 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -2982,7 +2982,7 @@ bool Chainstate::DisconnectTip(BlockValidationState& state, DisconnectedBlockTra // Let wallets know transactions went from 1-confirmed to // 0-confirmed or conflicted: if (m_chainman.m_options.signals) { - m_chainman.m_options.signals->BlockDisconnected(pblock, pindexDelete); + m_chainman.m_options.signals->BlockDisconnected(std::move(pblock), pindexDelete); } return true; } diff --git a/src/validationinterface.cpp b/src/validationinterface.cpp index 3e939de964e..45f38b3740b 100644 --- a/src/validationinterface.cpp +++ b/src/validationinterface.cpp @@ -241,12 +241,12 @@ void ValidationSignals::MempoolTransactionsRemovedForBlock(const std::vector& pblock, const CBlockIndex* pindex) +void ValidationSignals::BlockDisconnected(std::shared_ptr pblock, const CBlockIndex* pindex) { auto log_msg = LOG_MSG("%s: block hash=%s block height=%d", __func__, pblock->GetHash().ToString(), pindex->nHeight); - auto event = [pblock, pindex, this] { + auto event = [pblock = std::move(pblock), pindex, this] { m_internals->Iterate([&](CValidationInterface& callbacks) { callbacks.BlockDisconnected(pblock, pindex); }); }; ENQUEUE_AND_LOG_EVENT(std::move(event), std::move(log_msg)); diff --git a/src/validationinterface.h b/src/validationinterface.h index 641afd555be..8cfe41380ec 100644 --- a/src/validationinterface.h +++ b/src/validationinterface.h @@ -224,7 +224,7 @@ public: void TransactionRemovedFromMempool(const CTransactionRef&, MemPoolRemovalReason, uint64_t mempool_sequence); void MempoolTransactionsRemovedForBlock(const std::vector&, unsigned int nBlockHeight); void BlockConnected(const kernel::ChainstateRole&, std::shared_ptr, const CBlockIndex* pindex); - void BlockDisconnected(const std::shared_ptr &, const CBlockIndex* pindex); + void BlockDisconnected(std::shared_ptr, const CBlockIndex* pindex); void ChainStateFlushed(const kernel::ChainstateRole&, const CBlockLocator&); void BlockChecked(const std::shared_ptr&, const BlockValidationState&); void NewPoWValidBlock(const CBlockIndex *, const std::shared_ptr&);