@ -160,18 +160,23 @@ bool CCoinsViewCache::BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlockIn
@@ -160,18 +160,23 @@ bool CCoinsViewCache::BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlockIn
if ( it - > second . flags & CCoinsCacheEntry : : DIRTY ) { // Ignore non-dirty entries (optimization).
CCoinsMap : : iterator itUs = cacheCoins . find ( it - > first ) ;
if ( itUs = = cacheCoins . end ( ) ) {
if ( ! it - > second . coins . IsPruned ( ) ) {
// The parent cache does not have an entry, while the child
// cache does have (a non-pruned) one. Move the data up, and
// mark it as fresh (if the grandparent did have it, we
// would have pulled it in at first GetCoins).
assert ( it - > second . flags & CCoinsCacheEntry : : FRESH ) ;
// The parent cache does not have an entry, while the child does
// We can ignore it if it's both FRESH and pruned in the child
if ( ! ( it - > second . flags & CCoinsCacheEntry : : FRESH & & it - > second . coins . IsPruned ( ) ) ) {
// Otherwise we will need to create it in the parent
// and move the data up and mark it as dirty
CCoinsCacheEntry & entry = cacheCoins [ it - > first ] ;
entry . coins . swap ( it - > second . coins ) ;
cachedCoinsUsage + = entry . coins . DynamicMemoryUsage ( ) ;
entry . flags = CCoinsCacheEntry : : DIRTY | CCoinsCacheEntry : : FRESH ;
entry . flags = CCoinsCacheEntry : : DIRTY ;
// 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
// and already exist in the grandparent
if ( it - > second . flags & CCoinsCacheEntry : : FRESH )
entry . flags | = CCoinsCacheEntry : : FRESH ;
}
} else {
// Found the entry in the parent cache
if ( ( itUs - > second . flags & CCoinsCacheEntry : : FRESH ) & & it - > second . coins . IsPruned ( ) ) {
// The grandparent does not have an entry, and the child is
// modified and being pruned. This means we can just delete