From ca4c4c53a8b1417563c72da0aea626f111a7f25d Mon Sep 17 00:00:00 2001 From: Jeff Garzik Date: Fri, 13 Apr 2012 18:20:44 -0400 Subject: [PATCH] CTxMemPool: add helper methods, to reduce global mempool.mapTx accesses --- src/main.cpp | 24 ++++++++++++++++-------- src/main.h | 10 ++++++++++ 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index facf355ec0..1c040bdee7 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -702,7 +702,7 @@ bool CWalletTx::AcceptWalletTransaction(CTxDB& txdb, bool fCheckInputs) if (!tx.IsCoinBase()) { uint256 hash = tx.GetHash(); - if (!mempool.mapTx.count(hash) && !txdb.ContainsTx(hash)) + if (!mempool.exists(hash) && !txdb.ContainsTx(hash)) tx.AcceptToMemoryPool(txdb, fCheckInputs); } } @@ -1018,9 +1018,9 @@ bool CTransaction::FetchInputs(CTxDB& txdb, const map& mapTes // Get prev tx from single transactions in memory { LOCK(mempool.cs); - if (!mempool.mapTx.count(prevout.hash)) - return error("FetchInputs() : %s mempool.mapTx prev not found %s", GetHash().ToString().substr(0,10).c_str(), prevout.hash.ToString().substr(0,10).c_str()); - txPrev = mempool.mapTx[prevout.hash]; + if (!mempool.exists(prevout.hash)) + return error("FetchInputs() : %s mempool Tx prev not found %s", GetHash().ToString().substr(0,10).c_str(), prevout.hash.ToString().substr(0,10).c_str()); + txPrev = mempool.lookup(prevout.hash); } if (!fFound) txindex.vSpent.resize(txPrev.vout.size()); @@ -1189,9 +1189,9 @@ bool CTransaction::ClientConnectInputs() { // Get prev tx from single transactions in memory COutPoint prevout = vin[i].prevout; - if (!mempool.mapTx.count(prevout.hash)) + if (!mempool.exists(prevout.hash)) return false; - CTransaction& txPrev = mempool.mapTx[prevout.hash]; + CTransaction& txPrev = mempool.lookup(prevout.hash); if (prevout.n >= txPrev.vout.size()) return false; @@ -2136,8 +2136,16 @@ bool static AlreadyHave(CTxDB& txdb, const CInv& inv) { switch (inv.type) { - case MSG_TX: return mempool.mapTx.count(inv.hash) || mapOrphanTransactions.count(inv.hash) || txdb.ContainsTx(inv.hash); - case MSG_BLOCK: return mapBlockIndex.count(inv.hash) || mapOrphanBlocks.count(inv.hash); + case MSG_TX: + { + LOCK(mempool.cs); + return mempool.exists(inv.hash) || + mapOrphanTransactions.count(inv.hash) || + txdb.ContainsTx(inv.hash); + } + + case MSG_BLOCK: + return mapBlockIndex.count(inv.hash) || mapOrphanBlocks.count(inv.hash); } // Don't know what it is, just say we already got one return true; diff --git a/src/main.h b/src/main.h index 29bd358c5c..30bf1dd698 100644 --- a/src/main.h +++ b/src/main.h @@ -1621,6 +1621,16 @@ public: LOCK(cs); return mapTx.size(); } + + bool exists(uint256 hash) + { + return (mapTx.count(hash) != 0); + } + + CTransaction& lookup(uint256 hash) + { + return mapTx[hash]; + } }; extern CTxMemPool mempool;