Files
ternfs-XTXMarkets/cpp/AssertiveLock.hpp
2023-01-03 17:41:33 +00:00

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);
}
};