8#include "pedigree/kernel/Log.h"
9#include "pedigree/kernel/panic.h"
10#include "pedigree/kernel/process/OperationBarrier.h"
11#include "pedigree/kernel/process/TerminationDeferral.h"
12#include "pedigree/kernel/process/Thread.h"
14OperationBarrier::Lease::Lease() : m_Barrier(nullptr) {}
16OperationBarrier::Lease::Lease(
OperationBarrier* barrier) : m_Barrier(barrier) {}
18OperationBarrier::Lease::Lease(Lease&& other) noexcept : m_Barrier(other.m_Barrier) {
19 other.m_Barrier =
nullptr;
22OperationBarrier::Lease::~Lease() {
30 m_Barrier = other.m_Barrier;
31 other.m_Barrier =
nullptr;
36void OperationBarrier::Lease::reset() {
44OperationBarrier::OperationBarrier() : m_Waiters(), m_Open(true), m_ActiveOperations(0) {}
46OperationBarrier::~OperationBarrier() {
47 auto guard = m_Waiters.acquire();
48 if (m_Open || m_ActiveOperations) {
49 panic(
"OperationBarrier destroyed before close-and-drain completed.");
54 auto guard = m_Waiters.acquire();
74 auto guard = m_Waiters.acquire();
75 if (!m_ActiveOperations) {
76 panic(
"OperationBarrier operation count underflow.");
79 if (!m_Open && !m_ActiveOperations) {
85 auto guard = m_Waiters.acquire();
90 auto guard = m_Waiters.acquire();
91 if (m_ActiveOperations) {
101 auto guard = m_Waiters.acquire();
103 panic(
"OperationBarrier::wait called before close.");
105 if (!m_ActiveOperations) {
109 const WaitQueue::WakeReason reason =
111 reinterpret_cast<uintptr_t
>(__builtin_return_address(0)));
121bool OperationBarrier::isOpen() {
122 auto guard = m_Waiters.acquire();
126bool OperationBarrier::isClosedAndDrained() {
127 auto guard = m_Waiters.acquire();
128 return !m_Open && !m_ActiveOperations;
MUST_USE_RESULT bool tryCloseIfIdle()
MUST_USE_RESULT bool tryAcquire(Lease &lease)
MUST_USE_RESULT bool tryEnter()
void EXPORTED_PUBLIC panic(const char *msg) NORETURN