Bitcoin Core 28.99.0
P2P Digital Currency
epochguard.h
Go to the documentation of this file.
1// Copyright (c) 2009-2010 Satoshi Nakamoto
2// Copyright (c) 2009-2022 The Bitcoin Core developers
3// Distributed under the MIT software license, see the accompanying
4// file COPYING or http://www.opensource.org/licenses/mit-license.php.
5
6#ifndef BITCOIN_UTIL_EPOCHGUARD_H
7#define BITCOIN_UTIL_EPOCHGUARD_H
8
9#include <threadsafety.h>
10#include <util/macros.h>
11
12#include <cassert>
13
35{
36private:
37 uint64_t m_raw_epoch = 0;
38 bool m_guarded = false;
39
40public:
41 Epoch() = default;
42 Epoch(const Epoch&) = delete;
43 Epoch& operator=(const Epoch&) = delete;
44 Epoch(Epoch&&) = delete;
45 Epoch& operator=(Epoch&&) = delete;
46 ~Epoch() = default;
47
48 bool guarded() const { return m_guarded; }
49
50 class Marker
51 {
52 private:
53 uint64_t m_marker = 0;
54
55 // only allow modification via Epoch member functions
56 friend class Epoch;
57 Marker& operator=(const Marker&) = delete;
58
59 public:
60 Marker() = default;
61 Marker(const Marker&) = default;
62 Marker(Marker&&) = delete;
63 Marker& operator=(Marker&&) = delete;
64 ~Marker() = default;
65 };
66
68 {
69 private:
71
72 public:
73 explicit Guard(Epoch& epoch) EXCLUSIVE_LOCK_FUNCTION(epoch) : m_epoch(epoch)
74 {
75 assert(!m_epoch.m_guarded);
76 ++m_epoch.m_raw_epoch;
77 m_epoch.m_guarded = true;
78 }
80 {
81 assert(m_epoch.m_guarded);
82 ++m_epoch.m_raw_epoch; // ensure clear separation between epochs
83 m_epoch.m_guarded = false;
84 }
85 };
86
87 bool visited(Marker& marker) const EXCLUSIVE_LOCKS_REQUIRED(*this)
88 {
89 assert(m_guarded);
90 if (marker.m_marker < m_raw_epoch) {
91 // marker is from a previous epoch, so this is its first visit
92 marker.m_marker = m_raw_epoch;
93 return false;
94 } else {
95 return true;
96 }
97 }
98};
99
100#define WITH_FRESH_EPOCH(epoch) const Epoch::Guard UNIQUE_NAME(epoch_guard_)(epoch)
101
102#endif // BITCOIN_UTIL_EPOCHGUARD_H
Epoch & m_epoch
Definition: epochguard.h:70
~Guard() UNLOCK_FUNCTION()
Definition: epochguard.h:79
Guard(Epoch &epoch) EXCLUSIVE_LOCK_FUNCTION(epoch)
Definition: epochguard.h:73
Marker()=default
Marker & operator=(Marker &&)=delete
Marker & operator=(const Marker &)=delete
Marker(const Marker &)=default
~Marker()=default
Marker(Marker &&)=delete
Epoch: RAII-style guard for using epoch-based graph traversal algorithms.
Definition: epochguard.h:35
bool m_guarded
Definition: epochguard.h:38
Epoch(const Epoch &)=delete
~Epoch()=default
Epoch & operator=(Epoch &&)=delete
bool guarded() const
Definition: epochguard.h:48
uint64_t m_raw_epoch
Definition: epochguard.h:37
bool visited(Marker &marker) const EXCLUSIVE_LOCKS_REQUIRED(*this)
Definition: epochguard.h:87
Epoch & operator=(const Epoch &)=delete
Epoch(Epoch &&)=delete
Epoch()=default
#define EXCLUSIVE_LOCKS_REQUIRED(...)
Definition: threadsafety.h:49
#define EXCLUSIVE_LOCK_FUNCTION(...)
Definition: threadsafety.h:42
#define SCOPED_LOCKABLE
Definition: threadsafety.h:37
#define LOCKABLE
Definition: threadsafety.h:36
#define UNLOCK_FUNCTION(...)
Definition: threadsafety.h:46
assert(!tx.IsCoinBase())