Skip to content

Commit 1c76936

Browse files
committed
sysdeps/managarm: make sys_waitpid() cancelable
1 parent d6f6c07 commit 1c76936

File tree

1 file changed

+14
-3
lines changed

1 file changed

+14
-3
lines changed

sysdeps/managarm/generic/fork-exec.cpp

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,31 +60,42 @@ int sys_waitpid(pid_t pid, int *status, int flags, struct rusage *ru, pid_t *ret
6060
return ENOSYS;
6161
}
6262

63-
SignalGuard sguard;
63+
//SignalGuard sguard;
64+
65+
HelHandle cancel_handle;
66+
HEL_CHECK(helCreateOneshotEvent(&cancel_handle));
67+
helix::UniqueDescriptor cancel_event{cancel_handle};
6468

6569
managarm::posix::CntRequest<MemoryAllocator> req(getSysdepsAllocator());
6670
req.set_request_type(managarm::posix::CntReqType::WAIT);
6771
req.set_pid(pid);
6872
req.set_flags(flags);
6973

70-
auto [offer, send_head, recv_resp] =
71-
exchangeMsgsSync(
74+
auto [offer, send_head, push_descriptor, recv_resp] =
75+
exchangeMsgsSyncCancellable(
7276
getPosixLane(),
77+
cancel_handle,
7378
helix_ng::offer(
7479
helix_ng::sendBragiHeadOnly(req, getSysdepsAllocator()),
80+
helix_ng::pushDescriptor(cancel_event),
7581
helix_ng::recvInline()
7682
)
7783
);
7884

7985
HEL_CHECK(offer.error());
8086
HEL_CHECK(send_head.error());
87+
HEL_CHECK(push_descriptor.error());
8188
HEL_CHECK(recv_resp.error());
8289

8390
managarm::posix::SvrResponse<MemoryAllocator> resp(getSysdepsAllocator());
8491
resp.ParseFromArray(recv_resp.data(), recv_resp.length());
8592
if(resp.error() == managarm::posix::Errors::ILLEGAL_ARGUMENTS) {
8693
return EINVAL;
8794
}
95+
if (resp.error() == managarm::posix::Errors::INTERRUPTED) {
96+
mlibc::infoLogger() << "returning EINT" << frg::endlog;
97+
return EINTR;
98+
}
8899
__ensure(resp.error() == managarm::posix::Errors::SUCCESS);
89100
if(status)
90101
*status = resp.mode();

0 commit comments

Comments
 (0)