1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 16:37:35 +00:00

Kernel: Implement sigsuspend using a SignalBlocker

`sigsuspend` was previously implemented using a poll on an empty set of
file descriptors. However, this broke quite a few assumptions in
`SelectBlocker`, as it verifies at least one file descriptor to be
ready after waking up and as it relies on being notified by the file
descriptor.

A bare-bones `sigsuspend` may also be implemented by relying on any of
the `sigwait` functions, but as `sigsuspend` features several (currently
unimplemented) restrictions on how returns work, it is a syscall on its
own.
This commit is contained in:
Tim Schumacher 2022-05-13 13:15:45 +02:00 committed by Brian Gianforcaro
parent edbffb3c7a
commit cf0ad3715e
4 changed files with 28 additions and 1 deletions

View file

@ -334,6 +334,7 @@ public:
ErrorOr<FlatPtr> sys$sigaltstack(Userspace<stack_t const*> ss, Userspace<stack_t*> old_ss);
ErrorOr<FlatPtr> sys$sigprocmask(int how, Userspace<sigset_t const*> set, Userspace<sigset_t*> old_set);
ErrorOr<FlatPtr> sys$sigpending(Userspace<sigset_t*>);
ErrorOr<FlatPtr> sys$sigsuspend(Userspace<sigset_t const*>);
ErrorOr<FlatPtr> sys$sigtimedwait(Userspace<sigset_t const*>, Userspace<siginfo_t*>, Userspace<timespec const*>);
ErrorOr<FlatPtr> sys$getgroups(size_t, Userspace<gid_t*>);
ErrorOr<FlatPtr> sys$setgroups(size_t, Userspace<gid_t const*>);