The Pedigree Project 0.1
Completion.cc
1/*
2 * Copyright (c) 2026, Pedigree Developers
3 *
4 * Permission to use, copy, modify, and distribute this software for any
5 * purpose with or without fee is hereby granted.
6 */
7
8#include "pedigree/kernel/Log.h"
9#include "pedigree/kernel/process/Completion.h"
10#include "pedigree/kernel/process/Thread.h"
11
12Completion::Completion() : m_Waiters(), m_Completed(false), m_WaitClaimed(false) {}
13
14Completion::~Completion() = default;
15
16bool Completion::wait(WaitQueue::StackDiscardCleanup onStackDiscard, void* stackDiscardContext) {
17 Thread::StackDiscardScope discardScope(onStackDiscard, stackDiscardContext);
18 bool claimed = false;
19 while (true) {
20 auto guard = m_Waiters.acquire();
21 if (!claimed) {
22 if (m_WaitClaimed) {
23 FATAL("Completion waited more than once");
24 }
25 m_WaitClaimed = true;
26 claimed = true;
27 }
28
29 if (m_Completed) {
30 return true;
31 }
32
33 WaitQueue::WakeReason reason =
34 guard.wait(WaitQueue::Channel(), Thread::SemWait,
35 reinterpret_cast<uintptr_t>(__builtin_return_address(0)));
36 if (reason == WaitQueue::WakeReason::Unwinding ||
37 reason == WaitQueue::WakeReason::Terminating) {
38 return false;
39 }
40 }
41}
42
44 auto guard = m_Waiters.acquire();
45 if (m_Completed) {
46 return false;
47 }
48
49 m_Completed = true;
50 guard.wakeOne();
51 return true;
52}
53
54bool Completion::isComplete() {
55 auto guard = m_Waiters.acquire();
56 return m_Completed;
57}
bool complete()
Definition Completion.cc:43
MUST_USE_RESULT bool wait(WaitQueue::StackDiscardCleanup onStackDiscard=nullptr, void *stackDiscardContext=nullptr)
Definition Completion.cc:16