The Pedigree Project
0.1
src
modules
subsys
posix
queued-signal.h
1
/* Copyright (c) 2026, Pedigree Developers. */
2
#ifndef POSIX_QUEUED_SIGNAL_H
3
#define POSIX_QUEUED_SIGNAL_H
4
5
#include "pedigree/kernel/Log.h"
6
#include "pedigree/kernel/Spinlock.h"
7
#include "pedigree/kernel/process/ConditionVariable.h"
8
#include "pedigree/kernel/process/Event.h"
9
#include "pedigree/kernel/process/Mutex.h"
10
#include "pedigree/kernel/process/Process.h"
11
#include "pedigree/kernel/process/Readiness.h"
12
#include "pedigree/kernel/processor/types.h"
13
#include "pedigree/kernel/utilities/List.h"
14
#include "pedigree/kernel/utilities/SharedPointer.h"
15
16
class
Process
;
17
class
Thread
;
18
class
SignalQueueReservation
;
19
class
QueuedSignalState
;
20
class
SignalEventState
;
21
struct
LinuxKernelTimespec
;
22
23
struct
alignas
(8)
LinuxQueuedSiginfo
{
24
uint8_t bytes[128];
25
};
26
static_assert
(
sizeof
(
LinuxQueuedSiginfo
) == 128,
"Linux amd64 siginfo layout"
);
27
28
struct
PendingSignalRecord
{
29
int32_t number = 0, code = 0, pid = 0;
30
uint32_t uid = 0;
31
uint64_t value = 0;
32
int32_t timerId = 0, overrun = 0, status = 0;
33
uint64_t userTime = 0, systemTime = 0;
34
};
35
36
class
PendingSignalBinding
{
37
public
:
38
Thread
* thread =
nullptr
;
39
bool
alive
=
true
;
40
uint64_t generations[64] = {};
41
};
42
44
class
PendingSignalContext
final :
public
ReadinessSource
{
45
public
:
46
void
attach(
Process
* process);
47
void
close();
48
void
retireThread(
Thread
* thread);
49
SharedPointer<PendingSignalBinding>
bind(
Thread
* thread);
50
ReadyMask query(
const
SharedPointer<PendingSignalBinding>
& binding, uint64_t mask,
51
ReadinessGenerations
* generations =
nullptr
);
52
void
recordChange(
size_t
signal = 0,
Thread
* target =
nullptr
,
bool
processDirected =
false
);
53
void
publish();
54
void
wake();
55
uint64_t version()
const
{
56
return
__atomic_load_n(&m_Version, __ATOMIC_ACQUIRE);
57
}
58
Mutex
lock;
59
ConditionVariable
changed;
60
61
private
:
62
Process
* m_Process =
nullptr
;
63
bool
m_Closed =
false
;
64
uint64_t m_Version = 0;
65
uint64_t m_ProcessGenerations[64] = {};
66
List<SharedPointer<PendingSignalBinding>
, 0> m_Bindings;
67
};
68
70
class
PendingSignalNotification
{
71
public
:
72
explicit
PendingSignalNotification
(
const
SharedPointer<PendingSignalContext>
& context)
73
: m_Context(context), m_Version(0) {
74
PendingSignalContext
* retained = m_Context.
get
();
75
if
(!retained) {
76
FATAL(
"Pending signal notification has no context."
);
77
return
;
78
}
79
m_Version = retained->version();
80
}
81
~PendingSignalNotification
() {
82
PendingSignalContext
* retained = m_Context.
get
();
83
if
(!retained) {
84
FATAL(
"Pending signal notification lost its context."
);
85
return
;
86
}
87
if
(retained->version() != m_Version)
88
retained->publish();
89
}
90
91
private
:
92
SharedPointer<PendingSignalContext>
m_Context;
93
uint64_t m_Version;
94
};
95
97
class
PendingSignalReservation
{
98
public
:
99
PendingSignalReservation
() =
default
;
100
~PendingSignalReservation
();
101
bool
reserve(
Thread
* caller, uint64_t mask);
102
PendingSignalRecord
record()
const
;
103
void
commit(int32_t overrun);
104
void
rollback();
105
106
private
:
107
PendingSignalReservation
(
const
PendingSignalReservation
&) =
delete
;
108
PendingSignalReservation
& operator=(
const
PendingSignalReservation
&) =
delete
;
109
Thread
* m_Caller =
nullptr
;
110
Process::ThreadLease
m_Selected;
111
Event::Delivery
m_Delivery;
112
};
113
114
bool
posix_matching_pending(
Thread
* caller, uint64_t mask);
115
void
posix_signal_record_siginfo(
const
PendingSignalRecord
&,
LinuxQueuedSiginfo
&);
116
117
class
PosixTimerSignalToken
{
118
public
:
119
PosixTimerSignalToken
();
120
~PosixTimerSignalToken
();
121
bool
addExpirations(uint64_t count);
122
void
queueFailed();
123
int
getDeliveredOverrun();
124
int32_t timerId;
125
126
private
:
127
friend
class
QueuedSignalState
;
128
friend
bool
posix_signal_reserve_timer(
Process
*,
SharedPointer<PosixTimerSignalToken>
&);
129
friend
int
posix_signal_queue_timer(
Process
*,
Thread
*,
int
, uint64_t,
130
const
SharedPointer<PosixTimerSignalToken>
&);
131
friend
void
posix_signal_reset_timer(
Process
*,
const
SharedPointer<PosixTimerSignalToken>
&);
132
friend
void
posix_signal_cancel_timer(
Process
*,
const
SharedPointer<PosixTimerSignalToken>
&);
133
Spinlock
m_Lock;
134
bool
m_Active, m_Pending;
135
uint64_t m_Generation, m_Expirations;
136
int32_t m_DeliveredOverrun;
137
SharedPointer<SignalQueueReservation>
m_Reservation;
138
};
139
140
SharedPointer<SignalEventState>
posix_signal_reserve_queue(
Process
*);
141
bool
posix_signal_reserve_timer(
Process
*,
SharedPointer<PosixTimerSignalToken>
&);
142
int
posix_signal_queue_timer(
Process
*,
Thread
* target,
int
signal, uint64_t value,
143
const
SharedPointer<PosixTimerSignalToken>
&);
144
void
posix_signal_reset_timer(
Process
*,
const
SharedPointer<PosixTimerSignalToken>
&);
145
void
posix_signal_cancel_timer(
Process
*,
const
SharedPointer<PosixTimerSignalToken>
&);
146
147
int
posix_rt_sigpending(uint64_t* signals,
size_t
signalSetSize);
148
int
posix_rt_sigtimedwait(
const
uint64_t* signals,
LinuxQueuedSiginfo
* info,
149
const
LinuxKernelTimespec
* timeout,
size_t
signalSetSize);
150
int
posix_rt_sigqueueinfo(
int
pid,
int
signal,
const
LinuxQueuedSiginfo
* info);
151
152
#endif
ConditionVariable
Definition
ConditionVariable.h:35
Event::Delivery
Definition
Event.h:123
List
Definition
List.h:61
Mutex
Definition
Mutex.h:56
PendingSignalBinding
Definition
queued-signal.h:36
PendingSignalContext
Definition
queued-signal.h:44
PendingSignalNotification
Definition
queued-signal.h:70
PendingSignalReservation
Definition
queued-signal.h:97
PosixTimerSignalToken
Definition
queued-signal.h:117
Process::ThreadLease
Definition
Process.h:153
Process
Definition
Process.h:73
QueuedSignalState
Definition
queued-signal.cc:94
ReadinessSource
Definition
Readiness.h:86
SharedPointer
Definition
SharedPointer.h:31
SharedPointer::get
T * get() const
Definition
SharedPointer.h:197
SignalEventState
Definition
SignalEvent.h:28
SignalQueueReservation
Definition
queued-signal.cc:53
Spinlock
Definition
Spinlock.h:27
Thread
Definition
Thread.h:75
LinuxKernelTimespec
Definition
linux-wait-abi.h:15
LinuxQueuedSiginfo
Definition
queued-signal.h:23
PendingSignalRecord
Definition
queued-signal.h:28
ReadinessGenerations
Definition
Readiness.h:31
alive
Definition
tracee.c:26
Generated on Tue Sep 22 2026 06:05:42 for The Pedigree Project by
1.9.8