@ -146,8 +146,11 @@ void CCoinsViewCache::SetBestBlock(const uint256 &hashBlockIn) {
}
}
bool CCoinsViewCache : : BatchWrite ( CCoinsMap & mapCoins , const uint256 & hashBlockIn ) {
bool CCoinsViewCache : : BatchWrite ( CCoinsMap & mapCoins , const uint256 & hashBlockIn ) {
for ( CCoinsMap : : iterator it = mapCoins . begin ( ) ; it ! = mapCoins . end ( ) ; ) {
for ( CCoinsMap : : iterator it = mapCoins . begin ( ) ; it ! = mapCoins . end ( ) ; it = mapCoins . erase ( it ) ) {
if ( it - > second . flags & CCoinsCacheEntry : : DIRTY ) { // Ignore non-dirty entries (optimization).
// Ignore non-dirty entries (optimization).
if ( ! ( it - > second . flags & CCoinsCacheEntry : : DIRTY ) ) {
continue ;
}
CCoinsMap : : iterator itUs = cacheCoins . find ( it - > first ) ;
CCoinsMap : : iterator itUs = cacheCoins . find ( it - > first ) ;
if ( itUs = = cacheCoins . end ( ) ) {
if ( itUs = = cacheCoins . end ( ) ) {
// The parent cache does not have an entry, while the child does
// The parent cache does not have an entry, while the child does
@ -162,16 +165,18 @@ bool CCoinsViewCache::BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlockIn
// We can mark it FRESH in the parent if it was FRESH in the child
// We can mark it FRESH in the parent if it was FRESH in the child
// Otherwise it might have just been flushed from the parent's cache
// Otherwise it might have just been flushed from the parent's cache
// and already exist in the grandparent
// and already exist in the grandparent
if ( it - > second . flags & CCoinsCacheEntry : : FRESH )
if ( it - > second . flags & CCoinsCacheEntry : : FRESH ) {
entry . flags | = CCoinsCacheEntry : : FRESH ;
entry . flags | = CCoinsCacheEntry : : FRESH ;
}
}
}
} else {
} else {
// Assert that the child cache entry was not marked FRESH if the
// Assert that the child cache entry was not marked FRESH if the
// parent cache entry has unspent outputs. If this ever happens,
// parent cache entry has unspent outputs. If this ever happens,
// it means the FRESH flag was misapplied and there is a logic
// it means the FRESH flag was misapplied and there is a logic
// error in the calling code.
// error in the calling code.
if ( ( it - > second . flags & CCoinsCacheEntry : : FRESH ) & & ! itUs - > second . coin . IsSpent ( ) )
if ( ( it - > second . flags & CCoinsCacheEntry : : FRESH ) & & ! itUs - > second . coin . IsSpent ( ) ) {
throw std : : logic_error ( " FRESH flag misapplied to cache entry for base transaction with spendable outputs " ) ;
throw std : : logic_error ( " FRESH flag misapplied to cache entry for base transaction with spendable outputs " ) ;
}
// Found the entry in the parent cache
// Found the entry in the parent cache
if ( ( itUs - > second . flags & CCoinsCacheEntry : : FRESH ) & & it - > second . coin . IsSpent ( ) ) {
if ( ( itUs - > second . flags & CCoinsCacheEntry : : FRESH ) & & it - > second . coin . IsSpent ( ) ) {
@ -194,9 +199,6 @@ bool CCoinsViewCache::BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlockIn
}
}
}
}
}
}
CCoinsMap : : iterator itOld = it + + ;
mapCoins . erase ( itOld ) ;
}
hashBlock = hashBlockIn ;
hashBlock = hashBlockIn ;
return true ;
return true ;
}
}