Skip to content

Commit a002480

Browse files
committed
Update Haiku port for new signal handling system (ponylang#4984)
1 parent 6e37afb commit a002480

4 files changed

Lines changed: 434 additions & 84 deletions

File tree

packages/signals/_test.pony

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,26 @@ class \nodoc\ iso _TestHandleableSignalAccepts is UnitTest
103103
_assert_valid(h, Sig.info())
104104
_assert_valid(h, Sig.usr1())
105105
_assert_valid(h, Sig.sys())
106+
elseif haiku then
107+
_assert_valid(h, Sig.hup())
108+
_assert_valid(h, Sig.int())
109+
_assert_valid(h, Sig.quit())
110+
_assert_valid(h, Sig.pipe())
111+
_assert_valid(h, Sig.alrm())
112+
_assert_valid(h, Sig.term())
113+
_assert_valid(h, Sig.urg())
114+
_assert_valid(h, Sig.tstp())
115+
_assert_valid(h, Sig.cont())
116+
_assert_valid(h, Sig.chld())
117+
_assert_valid(h, Sig.ttin())
118+
_assert_valid(h, Sig.ttou())
119+
_assert_valid(h, Sig.xcpu())
120+
_assert_valid(h, Sig.xfsz())
121+
_assert_valid(h, Sig.vtalrm())
122+
_assert_valid(h, Sig.prof())
123+
_assert_valid(h, Sig.winch())
124+
_assert_valid(h, Sig.usr1())
125+
_assert_valid(h, Sig.sys())
106126
elseif windows then
107127
_assert_valid(h, Sig.int())
108128
_assert_valid(h, Sig.term())
@@ -122,7 +142,7 @@ class \nodoc\ iso _TestHandleableSignalRejectsFatal is UnitTest
122142
fun name(): String => "signals/HandleableSignal rejects fatal"
123143

124144
fun apply(h: TestHelper) =>
125-
ifdef linux or bsd or osx then
145+
ifdef linux or bsd or osx or haiku then
126146
_assert_invalid(h, Sig.ill())
127147
_assert_invalid(h, Sig.trap())
128148
_assert_invalid(h, Sig.abrt())
@@ -154,7 +174,7 @@ class \nodoc\ iso _TestHandleableSignalRejectsUncatchable is UnitTest
154174
fun name(): String => "signals/HandleableSignal rejects uncatchable"
155175

156176
fun apply(h: TestHelper) =>
157-
ifdef linux or bsd or osx then
177+
ifdef linux or bsd or osx or haiku then
158178
_assert_invalid(h, Sig.kill())
159179
_assert_invalid(h, Sig.stop())
160180
elseif windows then
@@ -201,7 +221,7 @@ class \nodoc\ iso _TestHandleableSignalRejectsReserved is UnitTest
201221
made the old system's SIGUSR2 handlers silently never fire, and the
202222
whitelist now refuses the number so the failure is visible instead. Sig.usr2()
203223
is a compile error on these builds, so the number is written out: 12 on
204-
Linux, 31 on BSD.
224+
Linux, 31 on BSD, 19 on Haiku.
205225
"""
206226
fun name(): String => "signals/HandleableSignal rejects reserved"
207227

@@ -211,6 +231,8 @@ class \nodoc\ iso _TestHandleableSignalRejectsReserved is UnitTest
211231
_assert_invalid(h, 12)
212232
elseif bsd then
213233
_assert_invalid(h, 31)
234+
elseif haiku then
235+
_assert_invalid(h, 19)
214236
end
215237
end
216238

@@ -251,6 +273,14 @@ class \nodoc\ iso _TestHandleableSignalRTBoundaries is UnitTest
251273
elseif osx then
252274
// The RT range is bsd-only; it must not leak into the osx whitelist.
253275
_assert_invalid(h, 65)
276+
elseif haiku then
277+
try
278+
_assert_valid(h, Sig.rt(0)?)
279+
_assert_valid(h, Sig.rt(7)?)
280+
else
281+
h.fail("in-range Sig.rt errored")
282+
end
283+
_assert_invalid(h, 8)
254284
end
255285

256286
fun _assert_valid(h: TestHelper, sig: U32) =>

packages/signals/handleable_signal.pony

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,16 @@ primitive HandleableSignalValidator is Validator[U32]
6868
or (sig == Sig.sys())
6969
or _usr2_handleable(sig)
7070
or _is_rt(sig)
71+
elseif haiku then
72+
(sig == Sig.hup()) or (sig == Sig.int()) or (sig == Sig.quit())
73+
or (sig == Sig.pipe()) or (sig == Sig.alrm()) or (sig == Sig.term())
74+
or (sig == Sig.urg()) or (sig == Sig.tstp()) or (sig == Sig.cont())
75+
or (sig == Sig.chld()) or (sig == Sig.ttin()) or (sig == Sig.ttou())
76+
or (sig == Sig.xcpu()) or (sig == Sig.xfsz()) or (sig == Sig.vtalrm())
77+
or (sig == Sig.prof()) or (sig == Sig.winch()) or (sig == Sig.usr1())
78+
or (sig == Sig.sys())
79+
or _usr2_handleable(sig)
80+
or _is_rt(sig)
7181
elseif linux then
7282
(sig == Sig.hup()) or (sig == Sig.int()) or (sig == Sig.quit())
7383
or (sig == Sig.pipe()) or (sig == Sig.alrm()) or (sig == Sig.term())
@@ -93,6 +103,8 @@ primitive HandleableSignalValidator is Validator[U32]
93103
(sig >= 65) and (sig <= 126)
94104
elseif linux then
95105
(sig >= 32) and (sig <= 64)
106+
elseif haiku then
107+
(sig >= 33) and (sig <= 40)
96108
else
97109
false
98110
end

packages/signals/sig.pony

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,13 @@ primitive Sig
199199
else
200200
error
201201
end
202+
elseif haiku then
203+
// Haiku's SIGRTMIN is 33 and SIGRTMAX is 40
204+
if n <= 7 then
205+
33 + n.u32()
206+
else
207+
error
208+
end
202209
else
203210
compile_error "no SIGRT"
204211
end

0 commit comments

Comments
 (0)