Skip to content

Commit 922dd20

Browse files
committed
sysdeps/managarm: make sys_waitpid() cancelable
1 parent c16410c commit 922dd20

File tree

1 file changed

+18
-3
lines changed

1 file changed

+18
-3
lines changed

sysdeps/managarm/generic/fork-exec.cpp

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,29 +54,44 @@ int sys_futex_wake(int *pointer) {
5454
}
5555

5656
int sys_waitpid(pid_t pid, int *status, int flags, struct rusage *ru, pid_t *ret_pid) {
57-
SignalGuard sguard;
57+
if (ru) {
58+
mlibc::infoLogger() << "mlibc: struct rusage in sys_waitpid is unsupported" << frg::endlog;
59+
return ENOSYS;
60+
}
61+
62+
HelHandle cancel_handle;
63+
HEL_CHECK(helCreateOneshotEvent(&cancel_handle));
64+
helix::UniqueDescriptor cancel_event{cancel_handle};
5865

5966
managarm::posix::CntRequest<MemoryAllocator> req(getSysdepsAllocator());
6067
req.set_request_type(managarm::posix::CntReqType::WAIT);
6168
req.set_pid(pid);
6269
req.set_flags(flags);
6370

64-
auto [offer, send_head, recv_resp] = exchangeMsgsSync(
71+
auto [offer, send_head, push_descriptor, recv_resp] = exchangeMsgsSyncCancellable(
6572
getPosixLane(),
73+
cancel_handle,
6674
helix_ng::offer(
67-
helix_ng::sendBragiHeadOnly(req, getSysdepsAllocator()), helix_ng::recvInline()
75+
helix_ng::sendBragiHeadOnly(req, getSysdepsAllocator()),
76+
helix_ng::pushDescriptor(cancel_event),
77+
helix_ng::recvInline()
6878
)
6979
);
7080

7181
HEL_CHECK(offer.error());
7282
HEL_CHECK(send_head.error());
83+
HEL_CHECK(push_descriptor.error());
7384
HEL_CHECK(recv_resp.error());
7485

7586
managarm::posix::SvrResponse<MemoryAllocator> resp(getSysdepsAllocator());
7687
resp.ParseFromArray(recv_resp.data(), recv_resp.length());
7788
if (resp.error() == managarm::posix::Errors::ILLEGAL_ARGUMENTS) {
7889
return EINVAL;
7990
}
91+
if (resp.error() == managarm::posix::Errors::INTERRUPTED) {
92+
mlibc::infoLogger() << "returning EINT" << frg::endlog;
93+
return EINTR;
94+
}
8095
__ensure(resp.error() == managarm::posix::Errors::SUCCESS);
8196
if (status)
8297
*status = resp.mode();

0 commit comments

Comments
 (0)