From e4d36dd1f40fae1a5c1da74f9fa3d959a1625fdb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Thu, 20 Oct 2005 17:19:46 +0000 Subject: [PATCH] Implemented sigpending(). Forgot to atomically get some thread_debug_info values. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@14458 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/system/kernel/signal.c | 61 +++++++++++++++++++++++++++----------- 1 file changed, 44 insertions(+), 17 deletions(-) diff --git a/src/system/kernel/signal.c b/src/system/kernel/signal.c index 7c399918d9..b56411db49 100644 --- a/src/system/kernel/signal.c +++ b/src/system/kernel/signal.c @@ -9,15 +9,14 @@ #include #include + #include -#include #include #include -#include #include #include -#include #include +#include #include #include @@ -51,12 +50,12 @@ notify_debugger(struct thread *thread, int signal, struct sigaction *handler, // first check the ignore signal masks the debugger specified for the thread - if (thread->debug_info.ignore_signals_once & signalMask) { + if (atomic_get(&thread->debug_info.ignore_signals_once) & signalMask) { atomic_and(&thread->debug_info.ignore_signals_once, ~signalMask); return true; } - if (thread->debug_info.ignore_signals & signalMask) + if (atomic_get(&thread->debug_info.ignore_signals) & signalMask) return true; // deliver the event @@ -510,6 +509,26 @@ set_alarm(bigtime_t time, uint32 mode) } +int +sigsuspend(const sigset_t *mask) +{ + return B_OK; +} + + +int +sigpending(sigset_t *set) +{ + struct thread *thread = thread_get_current_thread(); + + if (set == NULL) + return B_BAD_VALUE; + + *set = atomic_get(&thread->sig_pending); + return B_OK; +} + + // #pragma mark - @@ -572,27 +591,35 @@ _user_sigaction(int signal, const struct sigaction *userAction, struct sigaction int -_user_sigsuspend(const sigset_t *mask) +_user_sigsuspend(const sigset_t *userMask) { - sigset_t set; - if (mask == NULL) - return B_BAD_VALUE; + sigset_t mask; - if (user_memcpy(&set, mask, sizeof(sigset_t)) < B_OK) + if (userMask == NULL) + return B_BAD_VALUE; + if (user_memcpy(&mask, userMask, sizeof(sigset_t)) < B_OK) return B_BAD_ADDRESS; - // ToDo: implement - return B_ERROR; + return sigsuspend(&mask); } int -_user_sigpending(sigset_t *set) +_user_sigpending(sigset_t *userSet) { - if (set == NULL) - return B_BAD_VALUE; + sigset_t set; + int status; - // ToDo: implement - return B_ERROR; + if (userSet == NULL) + return B_BAD_VALUE; + if (!IS_USER_ADDRESS(userSet)) + return B_BAD_ADDRESS; + + status = sigpending(&set); + if (status == B_OK + && user_memcpy(userSet, &set, sizeof(sigset_t)) < B_OK) + return B_BAD_ADDRESS; + + return status; }