diff options
author | glozow <gloriajzhao@gmail.com> | 2021-09-29 20:30:32 +0100 |
---|---|---|
committer | glozow <gloriajzhao@gmail.com> | 2021-11-30 12:21:39 +0000 |
commit | bb9078ed51159fa162484f16993313ed6cf980e3 (patch) | |
tree | a258f71ad6ef97e996a4fc94dc239f9d882356c6 | |
parent | bedf246f1e2497a3641093c6e8fa11fb34dddac4 (diff) |
[refactor] put finality and maturity checking into a lambda
No behavior change.
-rw-r--r-- | src/txmempool.cpp | 19 |
1 files 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) { |