From bb9078ed51159fa162484f16993313ed6cf980e3 Mon Sep 17 00:00:00 2001 From: glozow Date: Wed, 29 Sep 2021 20:30:32 +0100 Subject: [PATCH] [refactor] put finality and maturity checking into a lambda No behavior change. --- src/txmempool.cpp | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/txmempool.cpp b/src/txmempool.cpp index 4cde0993a8..088a560e15 100644 --- a/src/txmempool.cpp +++ b/src/txmempool.cpp @@ -638,8 +638,13 @@ void CTxMemPool::removeForReorg(CChainState& active_chainstate, int flags) { // Remove transactions spending a coinbase which are now immature and no-longer-final transactions AssertLockHeld(cs); - setEntries txToRemove; - for (indexed_transaction_set::const_iterator it = mapTx.begin(); it != mapTx.end(); it++) { + AssertLockHeld(::cs_main); + + const auto check_final_and_mature = [this, &active_chainstate, flags](txiter it) + EXCLUSIVE_LOCKS_REQUIRED(cs, ::cs_main) { + bool should_remove = false; + AssertLockHeld(cs); + AssertLockHeld(::cs_main); const CTransaction& tx = it->GetTx(); LockPoints lp = it->GetLockPoints(); const bool validLP = TestLockPointValidity(active_chainstate.m_chain, &lp); @@ -648,7 +653,7 @@ void CTxMemPool::removeForReorg(CChainState& active_chainstate, int flags) || !CheckSequenceLocks(active_chainstate.m_chain.Tip(), view_mempool, tx, flags, &lp, validLP)) { // Note if CheckSequenceLocks fails the LockPoints may still be invalid // So it's critical that we remove the tx and not depend on the LockPoints. - txToRemove.insert(it); + should_remove = true; } else if (it->GetSpendsCoinbase()) { for (const CTxIn& txin : tx.vin) { indexed_transaction_set::const_iterator it2 = mapTx.find(txin.prevout.hash); @@ -658,11 +663,17 @@ void CTxMemPool::removeForReorg(CChainState& active_chainstate, int flags) if (m_check_ratio != 0) assert(!coin.IsSpent()); unsigned int nMemPoolHeight = active_chainstate.m_chain.Tip()->nHeight + 1; if (coin.IsSpent() || (coin.IsCoinBase() && ((signed long)nMemPoolHeight) - coin.nHeight < COINBASE_MATURITY)) { - txToRemove.insert(it); + should_remove = true; break; } } } + return should_remove; + }; + + setEntries txToRemove; + for (indexed_transaction_set::const_iterator it = mapTx.begin(); it != mapTx.end(); it++) { + if (check_final_and_mature(it)) txToRemove.insert(it); } setEntries setAllRemoves; for (txiter it : txToRemove) {