]> xenbits.xensource.com Git - unikraft/unikraft.git/commitdiff
lib/posix-process/signal: Add sigsuspend()
authorMichalis Pappas <michalis@unikraft.io>
Tue, 16 Jan 2024 11:49:36 +0000 (12:49 +0100)
committerUnikraft Bot <monkey@unikraft.io>
Wed, 26 Mar 2025 08:05:34 +0000 (08:05 +0000)
sigsuspend() temporarily replaces the signal mask of the current
thread and suspends its execution until a signal is delivered.
For more info see sigsuspend(2)

Signed-off-by: Michalis Pappas <michalis@unikraft.io>
Reviewed-by: Ioan-Teodor Teugea <ioan_teodor.teugea@stud.acs.upb.ro>
Reviewed-by: Sergiu Moga <sergiu@unikraft.io>
Reviewed-by: Andrei Tatar <andrei@unikraft.io>
Approved-by: Andrei Tatar <andrei@unikraft.io>
GitHub-Closes: #1248

lib/posix-process/Makefile.uk
lib/posix-process/signal/rt_sigsuspend.c [new file with mode: 0644]

index a174a4a30b6b4c2cbcdc75600b718f30a2b05d76..d256cfdbb3ab068fe2624901e3a43d70481cd306 100644 (file)
@@ -26,6 +26,7 @@ LIBPOSIX_PROCESS_SRCS-y += $(LIBPOSIX_PROCESS_BASE)/signal/pause.c
 LIBPOSIX_PROCESS_SRCS-y += $(LIBPOSIX_PROCESS_BASE)/signal/sigaltstack.c
 LIBPOSIX_PROCESS_SRCS-y += $(LIBPOSIX_PROCESS_BASE)/signal/rt_sigpending.c
 LIBPOSIX_PROCESS_SRCS-y += $(LIBPOSIX_PROCESS_BASE)/signal/rt_sigprocmask.c
+LIBPOSIX_PROCESS_SRCS-y += $(LIBPOSIX_PROCESS_BASE)/signal/rt_sigsuspend.c
 LIBPOSIX_PROCESS_SRCS-y += $(LIBPOSIX_PROCESS_BASE)/signal/rt_sigaction.c
 LIBPOSIX_PROCESS_SRCS-y += $(LIBPOSIX_PROCESS_BASE)/signal/rt_sigqueueinfo.c
 LIBPOSIX_PROCESS_SRCS-y += $(LIBPOSIX_PROCESS_BASE)/signal/rt_tgsigqueueinfo.c
@@ -53,6 +54,7 @@ UK_PROVIDED_SYSCALLS-$(CONFIG_LIBPOSIX_PROCESS) += pause-0
 UK_PROVIDED_SYSCALLS-$(CONFIG_LIBPOSIX_PROCESS) += sigaltstack-2
 UK_PROVIDED_SYSCALLS-$(CONFIG_LIBPOSIX_PROCESS) += rt_sigpending-2
 UK_PROVIDED_SYSCALLS-$(CONFIG_LIBPOSIX_PROCESS) += rt_sigprocmask-4
+UK_PROVIDED_SYSCALLS-$(CONFIG_LIBPOSIX_PROCESS) += rt_sigsuspend-2
 UK_PROVIDED_SYSCALLS-$(CONFIG_LIBPOSIX_PROCESS) += rt_sigaction-4
 UK_PROVIDED_SYSCALLS-$(CONFIG_LIBPOSIX_PROCESS) += rt_sigqueueinfo-3
 UK_PROVIDED_SYSCALLS-$(CONFIG_LIBPOSIX_PROCESS) += rt_tgsigqueueinfo-4
diff --git a/lib/posix-process/signal/rt_sigsuspend.c b/lib/posix-process/signal/rt_sigsuspend.c
new file mode 100644 (file)
index 0000000..3faf3d1
--- /dev/null
@@ -0,0 +1,56 @@
+/* SPDX-License-Identifier: BSD-3-Clause */
+/* Copyright (c) 2024, Unikraft GmbH and The Unikraft Authors.
+ * Licensed under the BSD-3-Clause License (the "License").
+ * You may not use this file except in compliance with the License.
+ */
+
+#include <stddef.h>
+#include <signal.h>
+#include <sys/types.h>
+#include <uk/syscall.h>
+
+#include "signal.h"
+#include "sigset.h"
+
+#if CONFIG_LIBPOSIX_PROCESS_SIGNAL
+UK_LLSYSCALL_R_DEFINE(int, rt_sigsuspend,
+                     const uk_sigset_t *, mask,
+                     size_t, sigsetsize)
+{
+       struct posix_thread *pthread;
+       uk_sigset_t suspend_mask;
+       uk_sigset_t saved_mask;
+
+       pthread = uk_pthread_current();
+       UK_ASSERT(pthread);
+
+       if (unlikely(sigsetsize != sizeof(uk_sigset_t)))
+               return -EINVAL;
+
+       /* It is not possible to block SIGKILL & SIGSTOP */
+       uk_sigcopyset(&suspend_mask, mask);
+       uk_sigdelset(&suspend_mask, SIGKILL);
+       uk_sigdelset(&suspend_mask, SIGSTOP);
+
+       /* Temporarily replace mask */
+       saved_mask = pthread->signal->mask;
+       pthread->signal->mask = suspend_mask;
+
+       /* Wait for signal */
+       pthread->state = POSIX_THREAD_BLOCKED_SIGNAL;
+       uk_semaphore_down(&pthread->signal->deliver_semaphore);
+
+       /* Restore mask */
+       pthread->signal->mask = saved_mask;
+
+       return -EINTR;
+}
+#else /* !CONFIG_LIBPOSIX_PROCESS_SIGNAL */
+UK_LLSYSCALL_R_DEFINE(int, rt_sigsuspend,
+                     const uk_sigset_t *, mask,
+                     size_t, sigsetsize)
+{
+       UK_WARN_STUBBED();
+       return -EINTR;
+}
+#endif /* !CONFIG_LIBPOSIX_PROCESS_SIGNAL */