Bitcoin Core 22.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-2020 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
11#include <cassert>
12
34{
35private:
36 uint64_t m_raw_epoch = 0;
37 bool m_guarded = false;
38
39public:
40 Epoch() = default;
41 Epoch(const Epoch&) = delete;
42 Epoch& operator=(const Epoch&) = delete;
43 Epoch(Epoch&&) = delete;
44 Epoch& operator=(Epoch&&) = delete;
45 ~Epoch() = default;
46
47 bool guarded() const { return m_guarded; }
48
49 class Marker
50 {
51 private:
52 uint64_t m_marker = 0;
53
54 // only allow modification via Epoch member functions
55 friend class Epoch;
56 Marker& operator=(const Marker&) = delete;
57
58 public:
59 Marker() = default;
60 Marker(const Marker&) = default;
61 Marker(Marker&&) = delete;
62 Marker& operator=(Marker&&) = delete;
63 ~Marker() = default;
64 };
65
67 {
68 private:
70
71 public:
72 explicit Guard(Epoch& epoch) EXCLUSIVE_LOCK_FUNCTION(epoch) : m_epoch(epoch)
73 {
74 assert(!m_epoch.m_guarded);
75 ++m_epoch.m_raw_epoch;
76 m_epoch.m_guarded = true;
77 }
79 {
80 assert(m_epoch.m_guarded);
81 ++m_epoch.m_raw_epoch; // ensure clear separation between epochs
82 m_epoch.m_guarded = false;
83 }
84 };
85
86 bool visited(Marker& marker) const EXCLUSIVE_LOCKS_REQUIRED(*this)
87 {
88 assert(m_guarded);
89 if (marker.m_marker < m_raw_epoch) {
90 // marker is from a previous epoch, so this is its first visit
91 marker.m_marker = m_raw_epoch;
92 return false;
93 } else {
94 return true;
95 }
96 }
97};
98
99#define WITH_FRESH_EPOCH(epoch) const Epoch::Guard PASTE2(epoch_guard_, __COUNTER__)(epoch)
100
101#endif // BITCOIN_UTIL_EPOCHGUARD_H
Epoch & m_epoch
Definition: epochguard.h:69
~Guard() UNLOCK_FUNCTION()
Definition: epochguard.h:78
Guard(Epoch &epoch) EXCLUSIVE_LOCK_FUNCTION(epoch)
Definition: epochguard.h:72
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:34
bool m_guarded
Definition: epochguard.h:37
Epoch(const Epoch &)=delete
~Epoch()=default
Epoch & operator=(Epoch &&)=delete
bool guarded() const
Definition: epochguard.h:47
uint64_t m_raw_epoch
Definition: epochguard.h:36
bool visited(Marker &marker) const EXCLUSIVE_LOCKS_REQUIRED(*this)
Definition: epochguard.h:86
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())