mirror of
https://github.com/XTXMarkets/ternfs.git
synced 2026-01-05 10:30:53 -06:00
40 lines
882 B
C++
40 lines
882 B
C++
#pragma once
|
|
|
|
#include <atomic>
|
|
|
|
#include "Common.hpp"
|
|
#include "Exception.hpp"
|
|
|
|
struct AssertiveLocked {
|
|
private:
|
|
std::atomic<bool>& _held;
|
|
public:
|
|
AssertiveLocked(std::atomic<bool>& held): _held(held) {
|
|
bool expected = false;
|
|
if (!_held.compare_exchange_strong(expected, true)) {
|
|
throw EGGS_EXCEPTION("could not aquire lock, are you using this function concurrently?");
|
|
}
|
|
}
|
|
|
|
AssertiveLocked() = delete;
|
|
AssertiveLocked& operator=(const AssertiveLocked&) = delete;
|
|
|
|
~AssertiveLocked() {
|
|
_held.store(false);
|
|
}
|
|
};
|
|
|
|
struct AssertiveLock {
|
|
private:
|
|
std::atomic<bool> _held;
|
|
public:
|
|
AssertiveLock(): _held(false) {}
|
|
|
|
AssertiveLock(const AssertiveLock&) = delete;
|
|
AssertiveLock& operator=(const AssertiveLock&) = delete;
|
|
|
|
AssertiveLocked lock() {
|
|
return AssertiveLocked(_held);
|
|
}
|
|
};
|