From 4e4fb4cbabcc10e723534f5f80f3e3cf09f6ca50 Mon Sep 17 00:00:00 2001 From: Andrew Toth Date: Fri, 28 Jun 2024 16:41:01 -0400 Subject: [PATCH] refactor: disallow setting flags in CCoinsCacheEntry constructors No behavior change because any entries that are added in EmplaceCoinInternalDANGER have DIRTY assigned to them after, and if they are not inserted then they will not be modified as before. This prepares moving the cache entry flags field to private access. Co-Authored-By: Martin Leitner-Ankerl --- src/coins.cpp | 7 +++++-- src/coins.h | 7 +++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/coins.cpp b/src/coins.cpp index 8c32752a3aa..8e8edcca636 100644 --- a/src/coins.cpp +++ b/src/coins.cpp @@ -108,10 +108,13 @@ void CCoinsViewCache::AddCoin(const COutPoint &outpoint, Coin&& coin, bool possi void CCoinsViewCache::EmplaceCoinInternalDANGER(COutPoint&& outpoint, Coin&& coin) { cachedCoinsUsage += coin.DynamicMemoryUsage(); - cacheCoins.emplace( + auto [it, inserted] = cacheCoins.emplace( std::piecewise_construct, std::forward_as_tuple(std::move(outpoint)), - std::forward_as_tuple(std::move(coin), CCoinsCacheEntry::DIRTY)); + std::forward_as_tuple(std::move(coin))); + if (inserted) { + it->second.AddFlags(CCoinsCacheEntry::DIRTY); + } } void AddCoins(CCoinsViewCache& cache, const CTransaction &tx, int nHeight, bool check_for_overwrite) { diff --git a/src/coins.h b/src/coins.h index b85c316ee51..bb1c17a8874 100644 --- a/src/coins.h +++ b/src/coins.h @@ -104,7 +104,7 @@ public: struct CCoinsCacheEntry { Coin coin; // The actual cached data. - unsigned char flags; + unsigned char flags{0}; enum Flags { /** @@ -127,9 +127,8 @@ struct CCoinsCacheEntry FRESH = (1 << 1), }; - CCoinsCacheEntry() : flags(0) {} - explicit CCoinsCacheEntry(Coin&& coin_) : coin(std::move(coin_)), flags(0) {} - CCoinsCacheEntry(Coin&& coin_, unsigned char flag) : coin(std::move(coin_)), flags(flag) {} + CCoinsCacheEntry() noexcept = default; + explicit CCoinsCacheEntry(Coin&& coin_) noexcept : coin(std::move(coin_)) {} inline void AddFlags(unsigned char flags) noexcept { this->flags |= flags; } inline void ClearFlags() noexcept