]> xenbits.xensource.com Git - unikraft/unikraft.git/commitdiff
lib/posix-process/signal: Add pause()
authorMichalis Pappas <michalis@unikraft.io>
Mon, 15 Jan 2024 06:13:31 +0000 (07:13 +0100)
committerUnikraft Bot <monkey@unikraft.io>
Wed, 26 Mar 2025 08:05:34 +0000 (08:05 +0000)
pause() causes the calling thread to sleep until
a signal is delivered. For more info see pause(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/exportsyms.uk
lib/posix-process/signal/pause.c [new file with mode: 0644]

index 15e6b05f15f1edf754c5b870c1bd6779aeab86ab..a174a4a30b6b4c2cbcdc75600b718f30a2b05d76 100644 (file)
@@ -22,6 +22,7 @@ LIBPOSIX_PROCESS_SRCS-$(CONFIG_LIBPOSIX_PROCESS_SIGNAL) += $(LIBPOSIX_PROCESS_BA
 LIBPOSIX_PROCESS_SRCS-$(CONFIG_LIBPOSIX_PROCESS_SIGNAL) += $(LIBPOSIX_PROCESS_BASE)/arch/$(CONFIG_UK_ARCH)/ucontext.c
 LIBPOSIX_PROCESS_SRCS-$(CONFIG_LIBPOSIX_PROCESS_SIGNAL) += $(LIBPOSIX_PROCESS_BASE)/arch/$(CONFIG_UK_ARCH)/signal.S|arch
 LIBPOSIX_PROCESS_SRCS-$(CONFIG_LIBPOSIX_PROCESS_SIGNAL) += $(LIBPOSIX_PROCESS_BASE)/signal/deliver.c
+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
@@ -48,6 +49,7 @@ LIBPOSIX_PROCESS_CXXINCLUDES-y += -I$(UK_PLAT_COMMON_BASE)/include
 
 UK_PROVIDED_SYSCALLS-$(CONFIG_LIBPOSIX_PROCESS_CLONE) += clone-5e
 UK_PROVIDED_SYSCALLS-$(CONFIG_LIBPOSIX_PROCESS_EXECVE) += execve-3e
+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
index 414d9bf4bc8ff72a3d9633ac6d8698913a8b7461..2ddf9d81c09b509bdd411dbf52a6c6b63bf65717 100644 (file)
@@ -43,6 +43,7 @@ uk_posix_process_kill
 clone
 vfork
 kill
+pause
 sigaltstack
 sigprocmask
 tgkill
diff --git a/lib/posix-process/signal/pause.c b/lib/posix-process/signal/pause.c
new file mode 100644 (file)
index 0000000..169c277
--- /dev/null
@@ -0,0 +1,36 @@
+/* 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 <sys/types.h>
+#include <uk/syscall.h>
+
+#include "process.h"
+#include "signal.h"
+
+#if CONFIG_LIBPOSIX_PROCESS_SIGNAL
+UK_SYSCALL_R_DEFINE(int, pause)
+{
+       struct posix_thread *pthread;
+
+       pthread = uk_pthread_current();
+       UK_ASSERT(pthread);
+
+       /* Return as soon as a signal is queued. The signal will
+        * be delivered at syscall exit.
+        */
+       pthread->state = POSIX_THREAD_BLOCKED_SIGNAL;
+       uk_semaphore_down(&pthread->signal->deliver_semaphore);
+
+       return -EINTR;
+}
+#else /* !CONFIG_LIBPOSIX_PROCESS_SIGNAL */
+UK_SYSCALL_R_DEFINE(int, pause)
+{
+       UK_WARN_STUBBED();
+       return 0;
+}
+#endif /* !CONFIG_LIBPOSIX_PROCESS_SIGNAL */