Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 21 additions & 19 deletions src/coins.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,31 +20,31 @@ CoinsViewEmpty& CoinsViewEmpty::Get()
return instance;
}

std::optional<Coin> CCoinsViewCache::PeekCoin(const COutPoint& outpoint) const
std::optional<Coin> CCoinsViewCacheRead::PeekCoin(const COutPoint& outpoint) const
{
if (auto it{cacheCoins.find(outpoint)}; it != cacheCoins.end()) {
return it->second.coin.IsSpent() ? std::nullopt : std::optional{it->second.coin};
}
return base->PeekCoin(outpoint);
}

CCoinsViewCache::CCoinsViewCache(CCoinsView* in_base, bool deterministic) :
CCoinsViewBacked(in_base), m_deterministic(deterministic),
CCoinsViewCacheRead::CCoinsViewCacheRead(CCoinsViewReadCacheMutable* in_base, bool deterministic) :
CCoinsViewBackedReadCacheMutable(in_base), m_deterministic(deterministic),
cacheCoins(0, SaltedOutpointHasher(/*deterministic=*/deterministic), CCoinsMap::key_equal{}, &m_cache_coins_memory_resource)
{
m_sentinel.second.SelfRef(m_sentinel);
}

size_t CCoinsViewCache::DynamicMemoryUsage() const {
size_t CCoinsViewCacheRead::DynamicMemoryUsage() const {
return memusage::DynamicUsage(cacheCoins) + cachedCoinsUsage;
}

std::optional<Coin> CCoinsViewCache::FetchCoinFromBase(const COutPoint& outpoint) const
std::optional<Coin> CCoinsViewCacheRead::FetchCoinFromBase(const COutPoint& outpoint) const
{
return base->GetCoin(outpoint);
}

CCoinsMap::iterator CCoinsViewCache::FetchCoin(const COutPoint &outpoint) const {
CCoinsMap::iterator CCoinsViewCacheRead::FetchCoin(const COutPoint &outpoint) const {
const auto [ret, inserted] = cacheCoins.try_emplace(outpoint);
if (inserted) {
if (auto coin{FetchCoinFromBase(outpoint)}) {
Expand All @@ -59,7 +59,7 @@ CCoinsMap::iterator CCoinsViewCache::FetchCoin(const COutPoint &outpoint) const
return ret;
}

std::optional<Coin> CCoinsViewCache::GetCoin(const COutPoint& outpoint) const
std::optional<Coin> CCoinsViewCacheRead::GetCoin(const COutPoint& outpoint) const
{
if (auto it{FetchCoin(outpoint)}; it != cacheCoins.end() && !it->second.coin.IsSpent()) return it->second.coin;
return std::nullopt;
Expand Down Expand Up @@ -155,7 +155,7 @@ bool CCoinsViewCache::SpendCoin(const COutPoint &outpoint, Coin* moveout) {

static const Coin coinEmpty;

const Coin& CCoinsViewCache::AccessCoin(const COutPoint &outpoint) const {
const Coin& CCoinsViewCacheRead::AccessCoin(const COutPoint &outpoint) const {
CCoinsMap::const_iterator it = FetchCoin(outpoint);
if (it == cacheCoins.end()) {
return coinEmpty;
Expand All @@ -164,18 +164,18 @@ const Coin& CCoinsViewCache::AccessCoin(const COutPoint &outpoint) const {
}
}

bool CCoinsViewCache::HaveCoin(const COutPoint& outpoint) const
bool CCoinsViewCacheRead::HaveCoin(const COutPoint& outpoint) const
{
CCoinsMap::const_iterator it = FetchCoin(outpoint);
return (it != cacheCoins.end() && !it->second.coin.IsSpent());
}

bool CCoinsViewCache::HaveCoinInCache(const COutPoint &outpoint) const {
bool CCoinsViewCacheRead::HaveCoinInCache(const COutPoint &outpoint) const {
CCoinsMap::const_iterator it = cacheCoins.find(outpoint);
return (it != cacheCoins.end() && !it->second.coin.IsSpent());
}

uint256 CCoinsViewCache::GetBestBlock() const {
uint256 CCoinsViewCacheRead::GetBestBlock() const {
if (m_block_hash.IsNull())
m_block_hash = base->GetBestBlock();
return m_block_hash;
Expand All @@ -186,6 +186,7 @@ void CCoinsViewCache::SetBestBlock(const uint256& in_block_hash)
m_block_hash = in_block_hash;
}

// TODO move order
void CCoinsViewCache::BatchWrite(CoinsViewCacheCursor& cursor, const uint256& in_block_hash)
{
for (auto it{cursor.Begin()}; it != cursor.End(); it = cursor.NextAndMaybeErase(*it)) {
Expand Down Expand Up @@ -260,7 +261,7 @@ void CCoinsViewCache::BatchWrite(CoinsViewCacheCursor& cursor, const uint256& in
void CCoinsViewCache::Flush(bool reallocate_cache)
{
auto cursor{CoinsViewCacheCursor(m_dirty_count, m_sentinel, cacheCoins, /*will_erase=*/true)};
base->BatchWrite(cursor, m_block_hash);
base_write->BatchWrite(cursor, m_block_hash);
Assume(m_dirty_count == 0);
cacheCoins.clear();
if (reallocate_cache) {
Expand All @@ -272,7 +273,7 @@ void CCoinsViewCache::Flush(bool reallocate_cache)
void CCoinsViewCache::Sync()
{
auto cursor{CoinsViewCacheCursor(m_dirty_count, m_sentinel, cacheCoins, /*will_erase=*/false)};
base->BatchWrite(cursor, m_block_hash);
base_write->BatchWrite(cursor, m_block_hash);
Assume(m_dirty_count == 0);
if (m_sentinel.second.Next() != &m_sentinel) {
/* BatchWrite must clear flags of all entries */
Expand Down Expand Up @@ -303,11 +304,11 @@ void CCoinsViewCache::Uncache(const COutPoint& hash)
}
}

unsigned int CCoinsViewCache::GetCacheSize() const {
unsigned int CCoinsViewCacheRead::GetCacheSize() const {
return cacheCoins.size();
}

bool CCoinsViewCache::HaveInputs(const CTransaction& tx) const
bool CCoinsViewCacheRead::HaveInputs(const CTransaction& tx) const
{
if (!tx.IsCoinBase()) {
for (unsigned int i = 0; i < tx.vin.size(); i++) {
Expand All @@ -329,7 +330,7 @@ void CCoinsViewCache::ReallocateCache()
::new (&cacheCoins) CCoinsMap{0, SaltedOutpointHasher{/*deterministic=*/m_deterministic}, CCoinsMap::key_equal{}, &m_cache_coins_memory_resource};
}

void CCoinsViewCache::SanityCheck() const
void CCoinsViewCacheRead::SanityCheck() const
{
size_t recomputed_usage = 0;
size_t count_dirty = 0;
Expand Down Expand Up @@ -393,17 +394,18 @@ static ReturnType ExecuteBackedWrapper(Func func, const std::vector<std::functio
}
}

// TODO: Use CCoinsViewBackedReadCacheMutable
std::optional<Coin> CCoinsViewErrorCatcher::GetCoin(const COutPoint& outpoint) const
{
return ExecuteBackedWrapper<std::optional<Coin>>([&]() { return CCoinsViewBacked::GetCoin(outpoint); }, m_err_callbacks);
return ExecuteBackedWrapper<std::optional<Coin>>([&]() { return CCoinsViewBackedWrite::GetCoin(outpoint); }, m_err_callbacks);
}

bool CCoinsViewErrorCatcher::HaveCoin(const COutPoint& outpoint) const
{
return ExecuteBackedWrapper<bool>([&]() { return CCoinsViewBacked::HaveCoin(outpoint); }, m_err_callbacks);
return ExecuteBackedWrapper<bool>([&]() { return CCoinsViewBackedWrite::HaveCoin(outpoint); }, m_err_callbacks);
}

std::optional<Coin> CCoinsViewErrorCatcher::PeekCoin(const COutPoint& outpoint) const
{
return ExecuteBackedWrapper<std::optional<Coin>>([&]() { return CCoinsViewBacked::PeekCoin(outpoint); }, m_err_callbacks);
return ExecuteBackedWrapper<std::optional<Coin>>([&]() { return CCoinsViewBackedWrite::PeekCoin(outpoint); }, m_err_callbacks);
}
Loading
Loading