aboutsummaryrefslogtreecommitdiff
path: root/src/txmempool.cpp
diff options
context:
space:
mode:
authorGavin Andresen <gavinandresen@gmail.com>2014-02-15 16:38:28 -0500
committerGavin Andresen <gavinandresen@gmail.com>2014-02-26 11:53:51 -0500
commit93a18a3650292afbb441a47d1fa1b94aeb0164e3 (patch)
tree36382e2077820d469fd1257ee35375a86206a878 /src/txmempool.cpp
parenta16ad1c0f465935d437bd9ae9875b28be49ec65b (diff)
Remove CWalletTx::vfSpent
Use the spent outpoint multimap to figure out which wallet transaction outputs are unspent, instead of a vfSpent array that is saved to disk.
Diffstat (limited to 'src/txmempool.cpp')
-rw-r--r--src/txmempool.cpp17
1 files changed, 10 insertions, 7 deletions
diff --git a/src/txmempool.cpp b/src/txmempool.cpp
index be251d1d64..64c9eac73d 100644
--- a/src/txmempool.cpp
+++ b/src/txmempool.cpp
@@ -86,7 +86,7 @@ bool CTxMemPool::addUnchecked(const uint256& hash, const CTxMemPoolEntry &entry)
}
-bool CTxMemPool::remove(const CTransaction &tx, bool fRecursive)
+void CTxMemPool::remove(const CTransaction &tx, std::list<CTransaction>& removed, bool fRecursive)
{
// Remove transaction from memory pool
{
@@ -95,34 +95,37 @@ bool CTxMemPool::remove(const CTransaction &tx, bool fRecursive)
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())
- remove(*it->second.ptx, true);
+ if (it == mapNextTx.end())
+ continue;
+ remove(*it->second.ptx, removed, true);
}
}
if (mapTx.count(hash))
{
+ removed.push_front(tx);
BOOST_FOREACH(const CTxIn& txin, tx.vin)
mapNextTx.erase(txin.prevout);
mapTx.erase(hash);
nTransactionsUpdated++;
}
}
- return true;
}
-bool CTxMemPool::removeConflicts(const CTransaction &tx)
+void CTxMemPool::removeConflicts(const CTransaction &tx, std::list<CTransaction>& removed)
{
// Remove transactions which depend on inputs of tx, recursively
+ list<CTransaction> result;
LOCK(cs);
BOOST_FOREACH(const CTxIn &txin, tx.vin) {
std::map<COutPoint, CInPoint>::iterator it = mapNextTx.find(txin.prevout);
if (it != mapNextTx.end()) {
const CTransaction &txConflict = *it->second.ptx;
if (txConflict != tx)
- remove(txConflict, true);
+ {
+ remove(txConflict, removed, true);
+ }
}
}
- return true;
}
void CTxMemPool::clear()