mirror of
https://github.com/bitcoin/bitcoin.git
synced 2024-11-20 02:25:40 +01:00
Make CTxMemPool::remove more effecient by avoiding recursion
This commit is contained in:
parent
b7b4318f3a
commit
7fd6219af7
@ -427,26 +427,32 @@ bool CTxMemPool::addUnchecked(const uint256& hash, const CTxMemPoolEntry &entry)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void CTxMemPool::remove(const CTransaction &tx, std::list<CTransaction>& removed, bool fRecursive)
|
void CTxMemPool::remove(const CTransaction &origTx, std::list<CTransaction>& removed, bool fRecursive)
|
||||||
{
|
{
|
||||||
// Remove transaction from memory pool
|
// Remove transaction from memory pool
|
||||||
{
|
{
|
||||||
LOCK(cs);
|
LOCK(cs);
|
||||||
uint256 hash = tx.GetHash();
|
std::deque<uint256> txToRemove;
|
||||||
if (fRecursive) {
|
txToRemove.push_back(origTx.GetHash());
|
||||||
for (unsigned int i = 0; i < tx.vout.size(); i++) {
|
while (!txToRemove.empty())
|
||||||
std::map<COutPoint, CInPoint>::iterator it = mapNextTx.find(COutPoint(hash, i));
|
|
||||||
if (it == mapNextTx.end())
|
|
||||||
continue;
|
|
||||||
remove(*it->second.ptx, removed, true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (mapTx.count(hash))
|
|
||||||
{
|
{
|
||||||
removed.push_front(tx);
|
uint256 hash = txToRemove.front();
|
||||||
|
txToRemove.pop_front();
|
||||||
|
if (!mapTx.count(hash))
|
||||||
|
continue;
|
||||||
|
const CTransaction& tx = mapTx[hash].GetTx();
|
||||||
|
if (fRecursive) {
|
||||||
|
for (unsigned int i = 0; i < tx.vout.size(); i++) {
|
||||||
|
std::map<COutPoint, CInPoint>::iterator it = mapNextTx.find(COutPoint(hash, i));
|
||||||
|
if (it == mapNextTx.end())
|
||||||
|
continue;
|
||||||
|
txToRemove.push_back(it->second.ptx->GetHash());
|
||||||
|
}
|
||||||
|
}
|
||||||
BOOST_FOREACH(const CTxIn& txin, tx.vin)
|
BOOST_FOREACH(const CTxIn& txin, tx.vin)
|
||||||
mapNextTx.erase(txin.prevout);
|
mapNextTx.erase(txin.prevout);
|
||||||
|
|
||||||
|
removed.push_back(tx);
|
||||||
totalTxSize -= mapTx[hash].GetTxSize();
|
totalTxSize -= mapTx[hash].GetTxSize();
|
||||||
mapTx.erase(hash);
|
mapTx.erase(hash);
|
||||||
nTransactionsUpdated++;
|
nTransactionsUpdated++;
|
||||||
|
Loading…
Reference in New Issue
Block a user