Bitcoin Core 29.99.0
P2P Digital Currency
semaphore_grant.h
Go to the documentation of this file.
1// Copyright (c) 2009-2010 Satoshi Nakamoto
2// Copyright (c) 2009-present 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_SEMAPHORE_GRANT_H
7#define BITCOIN_SEMAPHORE_GRANT_H
8
9#include <semaphore>
10
12template <std::ptrdiff_t LeastMaxValue = std::counting_semaphore<>::max()>
14{
15private:
16 std::counting_semaphore<LeastMaxValue>* sem;
18
19public:
20 void Acquire() noexcept
21 {
22 if (fHaveGrant) {
23 return;
24 }
25 sem->acquire();
26 fHaveGrant = true;
27 }
28
29 void Release() noexcept
30 {
31 if (!fHaveGrant) {
32 return;
33 }
34 sem->release();
35 fHaveGrant = false;
36 }
37
38 bool TryAcquire() noexcept
39 {
40 if (!fHaveGrant && sem->try_acquire()) {
41 fHaveGrant = true;
42 }
43 return fHaveGrant;
44 }
45
46 // Disallow copy.
49
50 // Allow move.
52 {
53 sem = other.sem;
54 fHaveGrant = other.fHaveGrant;
55 other.fHaveGrant = false;
56 other.sem = nullptr;
57 }
58
60 {
61 Release();
62 sem = other.sem;
63 fHaveGrant = other.fHaveGrant;
64 other.fHaveGrant = false;
65 other.sem = nullptr;
66 return *this;
67 }
68
69 CountingSemaphoreGrant() noexcept : sem(nullptr), fHaveGrant(false) {}
70
71 explicit CountingSemaphoreGrant(std::counting_semaphore<LeastMaxValue>& sema, bool fTry = false) noexcept : sem(&sema), fHaveGrant(false)
72 {
73 if (fTry) {
74 TryAcquire();
75 } else {
76 Acquire();
77 }
78 }
79
81 {
82 Release();
83 }
84
85 explicit operator bool() const noexcept
86 {
87 return fHaveGrant;
88 }
89};
90
92
93#endif // BITCOIN_SEMAPHORE_GRANT_H
RAII-style semaphore lock.
CountingSemaphoreGrant() noexcept
CountingSemaphoreGrant(CountingSemaphoreGrant &&other) noexcept
CountingSemaphoreGrant & operator=(CountingSemaphoreGrant &&other) noexcept
std::counting_semaphore< LeastMaxValue > * sem
bool TryAcquire() noexcept
void Release() noexcept
CountingSemaphoreGrant(std::counting_semaphore< LeastMaxValue > &sema, bool fTry=false) noexcept
CountingSemaphoreGrant(const CountingSemaphoreGrant &)=delete
void Acquire() noexcept
CountingSemaphoreGrant & operator=(const CountingSemaphoreGrant &)=delete