The Pedigree Project 0.1
BufferMonitors.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/process/Event.h"
9#include "pedigree/kernel/process/Semaphore.h"
10#include "pedigree/kernel/utilities/BufferMonitors.h"
11#include "pedigree/kernel/utilities/new"
12#include "pedigree/kernel/utilities/utility.h"
13
14#include <config.h>
15
16#if THREADS
17#include "pedigree/kernel/process/Thread.h"
18#endif
19
21 MonitorTarget(Thread* thread, Event* event, Event::SendLease registration)
22 : pThread(thread),
23 pEvent(event),
24 pSemaphore(nullptr),
25 eventRegistration(pedigree_std::move(registration)) {}
26
27 explicit MonitorTarget(Semaphore* semaphore)
28 : pThread(nullptr), pEvent(nullptr), pSemaphore(semaphore), eventRegistration() {}
29
30 Thread* pThread;
31 Event* pEvent;
32 Semaphore* pSemaphore;
33 Event::SendLease eventRegistration;
34};
35
36BufferMonitors::BufferMonitors() : m_Targets() {}
37
38BufferMonitors::~BufferMonitors() {
39 clear();
40}
41
42bool BufferMonitors::add(Thread* thread, Event* event) {
43 Event::SendLease registration;
44 if (!event->tryAcquireRegistration(registration)) {
45 return false;
46 }
47
48 m_Targets.pushBack(new MonitorTarget(thread, event, pedigree_std::move(registration)));
49 return true;
50}
51
52void BufferMonitors::add(Semaphore* semaphore) {
53 m_Targets.pushBack(new MonitorTarget(semaphore));
54}
55
57 while (m_Targets.count()) {
58 MonitorTarget* target = m_Targets.popFront();
59#if THREADS
60 if (target->pThread) {
61 target->pThread->sendEvent(target->pEvent);
62 } else if (target->pSemaphore) {
63 target->pSemaphore->release();
64 }
65#endif
66 delete target;
67 }
68}
69
71 while (m_Targets.count()) {
72 MonitorTarget* target = m_Targets.popFront();
73#if THREADS
74 if (target->pSemaphore) {
75 target->pSemaphore->release();
76 }
77#endif
78 delete target;
79 }
80}
81
82void BufferMonitors::cull(Thread* thread) {
83 for (auto it = m_Targets.begin(); it != m_Targets.end();) {
84 MonitorTarget* target = *it;
85 if (target->pThread == thread) {
86 delete target;
87 it = m_Targets.erase(it);
88 } else {
89 ++it;
90 }
91 }
92}
93
94void BufferMonitors::cull(Semaphore* semaphore) {
95 for (auto it = m_Targets.begin(); it != m_Targets.end();) {
96 MonitorTarget* target = *it;
97 if (target->pSemaphore == semaphore) {
98 delete target;
99 it = m_Targets.erase(it);
100 } else {
101 ++it;
102 }
103 }
104}
105
106void BufferMonitors::cull(Event* event) {
107 for (auto it = m_Targets.begin(); it != m_Targets.end();) {
108 MonitorTarget* target = *it;
109 if (target->pEvent == event) {
110 delete target;
111 it = m_Targets.erase(it);
112 } else {
113 ++it;
114 }
115 }
116}
bool add(Thread *thread, Event *event)
Definition Event.h:49
bool tryAcquireRegistration(SendLease &registration)
Definition Event.cc:392
void release(size_t n=1)
Definition Semaphore.cc:549
bool sendEvent(Event *pEvent)
Definition Thread.cc:1100