threading: semaphore: move CountingSemaphoreGrant to its own header

This commit is contained in:
Cory Fields 2025-05-08 19:53:26 +00:00
parent fd15469892
commit 6f7052a7b9
4 changed files with 96 additions and 83 deletions

View File

@ -24,6 +24,7 @@
#include <policy/feerate.h>
#include <protocol.h>
#include <random.h>
#include <semaphore_grant.h>
#include <span.h>
#include <streams.h>
#include <sync.h>

93
src/semaphore_grant.h Normal file
View File

@ -0,0 +1,93 @@
// Copyright (c) 2009-2010 Satoshi Nakamoto
// Copyright (c) 2009-present The Bitcoin Core developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#ifndef BITCOIN_SEMAPHORE_GRANT_H
#define BITCOIN_SEMAPHORE_GRANT_H
#include <semaphore>
/** RAII-style semaphore lock */
template <std::ptrdiff_t LeastMaxValue = std::counting_semaphore<>::max()>
class CountingSemaphoreGrant
{
private:
std::counting_semaphore<LeastMaxValue>* sem;
bool fHaveGrant;
public:
void Acquire() noexcept
{
if (fHaveGrant) {
return;
}
sem->acquire();
fHaveGrant = true;
}
void Release() noexcept
{
if (!fHaveGrant) {
return;
}
sem->release();
fHaveGrant = false;
}
bool TryAcquire() noexcept
{
if (!fHaveGrant && sem->try_acquire()) {
fHaveGrant = true;
}
return fHaveGrant;
}
// Disallow copy.
CountingSemaphoreGrant(const CountingSemaphoreGrant&) = delete;
CountingSemaphoreGrant& operator=(const CountingSemaphoreGrant&) = delete;
// Allow move.
CountingSemaphoreGrant(CountingSemaphoreGrant&& other) noexcept
{
sem = other.sem;
fHaveGrant = other.fHaveGrant;
other.fHaveGrant = false;
other.sem = nullptr;
}
CountingSemaphoreGrant& operator=(CountingSemaphoreGrant&& other) noexcept
{
Release();
sem = other.sem;
fHaveGrant = other.fHaveGrant;
other.fHaveGrant = false;
other.sem = nullptr;
return *this;
}
CountingSemaphoreGrant() noexcept : sem(nullptr), fHaveGrant(false) {}
explicit CountingSemaphoreGrant(std::counting_semaphore<LeastMaxValue>& sema, bool fTry = false) noexcept : sem(&sema), fHaveGrant(false)
{
if (fTry) {
TryAcquire();
} else {
Acquire();
}
}
~CountingSemaphoreGrant()
{
Release();
}
explicit operator bool() const noexcept
{
return fHaveGrant;
}
};
using BinarySemaphoreGrant = CountingSemaphoreGrant<1>;
#endif // BITCOIN_SEMAPHORE_GRANT_H

View File

@ -16,7 +16,6 @@
#include <condition_variable>
#include <mutex>
#include <semaphore>
#include <string>
#include <thread>
@ -301,86 +300,4 @@ inline MutexType* MaybeCheckNotHeld(MutexType* m) LOCKS_EXCLUDED(m) LOCK_RETURNE
//! gcc and the -Wreturn-stack-address flag in clang, both enabled by default.
#define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }())
/** RAII-style semaphore lock */
template <std::ptrdiff_t LeastMaxValue = std::counting_semaphore<>::max()>
class CountingSemaphoreGrant
{
private:
std::counting_semaphore<LeastMaxValue>* sem;
bool fHaveGrant;
public:
void Acquire() noexcept
{
if (fHaveGrant) {
return;
}
sem->acquire();
fHaveGrant = true;
}
void Release() noexcept
{
if (!fHaveGrant) {
return;
}
sem->release();
fHaveGrant = false;
}
bool TryAcquire() noexcept
{
if (!fHaveGrant && sem->try_acquire()) {
fHaveGrant = true;
}
return fHaveGrant;
}
// Disallow copy.
CountingSemaphoreGrant(const CountingSemaphoreGrant&) = delete;
CountingSemaphoreGrant& operator=(const CountingSemaphoreGrant&) = delete;
// Allow move.
CountingSemaphoreGrant(CountingSemaphoreGrant&& other) noexcept
{
sem = other.sem;
fHaveGrant = other.fHaveGrant;
other.fHaveGrant = false;
other.sem = nullptr;
}
CountingSemaphoreGrant& operator=(CountingSemaphoreGrant&& other) noexcept
{
Release();
sem = other.sem;
fHaveGrant = other.fHaveGrant;
other.fHaveGrant = false;
other.sem = nullptr;
return *this;
}
CountingSemaphoreGrant() noexcept : sem(nullptr), fHaveGrant(false) {}
explicit CountingSemaphoreGrant(std::counting_semaphore<LeastMaxValue>& sema, bool fTry = false) noexcept : sem(&sema), fHaveGrant(false)
{
if (fTry) {
TryAcquire();
} else {
Acquire();
}
}
~CountingSemaphoreGrant()
{
Release();
}
explicit operator bool() const noexcept
{
return fHaveGrant;
}
};
using BinarySemaphoreGrant = CountingSemaphoreGrant<1>;
#endif // BITCOIN_SYNC_H

View File

@ -8,6 +8,8 @@
#include <sync.h>
#include <wallet/db.h>
#include <semaphore>
struct bilingual_str;
struct sqlite3_stmt;