From 8e45ed66dde5d5eb5fde0fc1eba64b26bd48bfb0 Mon Sep 17 00:00:00 2001 From: Jeff Garzik Date: Fri, 13 Apr 2012 16:28:07 -0400 Subject: [PATCH] CTxMemPool: encapsulate AddToMemoryPoolUnchecked(), RemoveFromMemoryPool(), and nPooledTx --- src/bitcoinrpc.cpp | 2 +- src/main.cpp | 42 +++++++++++++++++++----------------------- src/main.h | 15 +++++++++++---- 3 files changed, 31 insertions(+), 28 deletions(-) diff --git a/src/bitcoinrpc.cpp b/src/bitcoinrpc.cpp index 63c51ada8..b8ef5275f 100644 --- a/src/bitcoinrpc.cpp +++ b/src/bitcoinrpc.cpp @@ -363,7 +363,7 @@ Value getmininginfo(const Array& params, bool fHelp) obj.push_back(Pair("generate", GetBoolArg("-gen"))); obj.push_back(Pair("genproclimit", (int)GetArg("-genproclimit", -1))); obj.push_back(Pair("hashespersec", gethashespersec(params, false))); - obj.push_back(Pair("pooledtx", (uint64_t)nPooledTx)); + obj.push_back(Pair("pooledtx", (uint64_t)mempool.size())); obj.push_back(Pair("testnet", fTestNet)); return obj; } diff --git a/src/main.cpp b/src/main.cpp index 9e2fbe99e..ba20af055 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -23,7 +23,7 @@ set setpwalletRegistered; CCriticalSection cs_main; -static CTxMemPool mempool; +CTxMemPool mempool; unsigned int nTransactionsUpdated = 0; map mapBlockIndex; @@ -576,9 +576,9 @@ bool CTransaction::AcceptToMemoryPool(CTxDB& txdb, bool fCheckInputs, bool* pfMi if (ptxOld) { printf("AcceptToMemoryPool() : replacing tx %s with new version\n", ptxOld->GetHash().ToString().c_str()); - ptxOld->RemoveFromMemoryPool(); + mempool.remove(*ptxOld); } - AddToMemoryPoolUnchecked(); + mempool.addUnchecked(*this); } ///// are we sure this is ok when loading transactions or restoring block txes @@ -590,39 +590,35 @@ bool CTransaction::AcceptToMemoryPool(CTxDB& txdb, bool fCheckInputs, bool* pfMi return true; } -uint64 nPooledTx = 0; - -bool CTransaction::AddToMemoryPoolUnchecked() +bool CTxMemPool::addUnchecked(CTransaction &tx) { - printf("AcceptToMemoryPoolUnchecked(): size %lu\n", mempool.mapTx.size()); + printf("AcceptToMemoryPoolUnchecked(): size %lu\n", mapTx.size()); // Add to memory pool without checking anything. Don't call this directly, // call AcceptToMemoryPool to properly check the transaction first. { - LOCK(mempool.cs); - uint256 hash = GetHash(); - mempool.mapTx[hash] = *this; - for (int i = 0; i < vin.size(); i++) - mempool.mapNextTx[vin[i].prevout] = CInPoint(&mempool.mapTx[hash], i); + LOCK(cs); + uint256 hash = tx.GetHash(); + mapTx[hash] = tx; + for (int i = 0; i < tx.vin.size(); i++) + mapNextTx[tx.vin[i].prevout] = CInPoint(&mapTx[hash], i); nTransactionsUpdated++; - ++nPooledTx; } return true; } -bool CTransaction::RemoveFromMemoryPool() +bool CTxMemPool::remove(CTransaction &tx) { // Remove transaction from memory pool { - LOCK(mempool.cs); - uint256 hash = GetHash(); - if (mempool.mapTx.count(hash)) + LOCK(cs); + uint256 hash = tx.GetHash(); + if (mapTx.count(hash)) { - BOOST_FOREACH(const CTxIn& txin, vin) - mempool.mapNextTx.erase(txin.prevout); - mempool.mapTx.erase(hash); + BOOST_FOREACH(const CTxIn& txin, tx.vin) + mapNextTx.erase(txin.prevout); + mapTx.erase(hash); nTransactionsUpdated++; - --nPooledTx; } } return true; @@ -1435,7 +1431,7 @@ bool static Reorganize(CTxDB& txdb, CBlockIndex* pindexNew) // Delete redundant memory transactions that are in the connected branch BOOST_FOREACH(CTransaction& tx, vDelete) - tx.RemoveFromMemoryPool(); + mempool.remove(tx); printf("REORGANIZE: done\n"); @@ -1471,7 +1467,7 @@ bool CBlock::SetBestChainInner(CTxDB& txdb, CBlockIndex *pindexNew) // Delete redundant memory transactions BOOST_FOREACH(CTransaction& tx, vtx) - tx.RemoveFromMemoryPool(); + mempool.remove(tx); return true; } diff --git a/src/main.h b/src/main.h index ef4ee137b..bf24944ce 100644 --- a/src/main.h +++ b/src/main.h @@ -67,7 +67,6 @@ extern CBigNum bnBestChainWork; extern CBigNum bnBestInvalidWork; extern uint256 hashBestChain; extern CBlockIndex* pindexBest; -extern uint64 nPooledTx; extern unsigned int nTransactionsUpdated; extern uint64 nLastBlockTx; extern uint64 nLastBlockSize; @@ -689,9 +688,6 @@ public: protected: const CTxOut& GetOutputFor(const CTxIn& input, const MapPrevTx& inputs) const; - bool AddToMemoryPoolUnchecked(); -public: - bool RemoveFromMemoryPool(); }; @@ -1614,6 +1610,17 @@ public: mutable CCriticalSection cs; std::map mapTx; std::map mapNextTx; + + bool addUnchecked(CTransaction &tx); + bool remove(CTransaction &tx); + + unsigned long size() + { + LOCK(cs); + return mapTx.size(); + } }; +extern CTxMemPool mempool; + #endif