diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2025-03-06 00:10:40 +0100 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2025-03-06 02:28:35 +0100 |
commit | 7a185eb9e944553fb5f8ce8491e1f8569f2f4aa0 (patch) | |
tree | 8b6bee22ddc3bf729809c8cf7cd7eb90210391b8 | |
parent | 596130591ae4b058a529cc1318b95e624559054c (diff) | |
download | glibc-7a185eb9e944553fb5f8ce8491e1f8569f2f4aa0.zip glibc-7a185eb9e944553fb5f8ce8491e1f8569f2f4aa0.tar.gz glibc-7a185eb9e944553fb5f8ce8491e1f8569f2f4aa0.tar.bz2 |
hurd: Consolidate signal mask change
__pthread_sigstate and __sigprocmask were already the same, except for
clear_pending.
-rw-r--r-- | hurd/Makefile | 1 | ||||
-rw-r--r-- | sysdeps/hurd/include/hurd/signal.h | 4 | ||||
-rw-r--r-- | sysdeps/mach/hurd/htl/pt-sigstate.c | 55 | ||||
-rw-r--r-- | sysdeps/mach/hurd/sigprocmask.c | 51 | ||||
-rw-r--r-- | sysdeps/mach/hurd/sigthreadmask.c | 84 |
5 files changed, 92 insertions, 103 deletions
diff --git a/hurd/Makefile b/hurd/Makefile index 7bb8ec4..cf70b8c 100644 --- a/hurd/Makefile +++ b/hurd/Makefile @@ -131,6 +131,7 @@ sig = \ longjmp-ts \ preempt-sig \ siginfo \ + sigthreadmask \ sigunwind \ thread-cancel \ thread-self \ diff --git a/sysdeps/hurd/include/hurd/signal.h b/sysdeps/hurd/include/hurd/signal.h index fab8d1b..a7b157d 100644 --- a/sysdeps/hurd/include/hurd/signal.h +++ b/sysdeps/hurd/include/hurd/signal.h @@ -10,6 +10,10 @@ libc_hidden_proto (_hurd_self_sigstate) #ifndef _ISOMAC +#include <bits/types/error_t.h> +extern error_t __sigthreadmask (struct hurd_sigstate *ss, int how, + const sigset_t *set, sigset_t *oset, int clear_pending); + #if defined __USE_EXTERN_INLINES # if IS_IN (libc) || IS_IN (libpthread) # include <sigsetops.h> diff --git a/sysdeps/mach/hurd/htl/pt-sigstate.c b/sysdeps/mach/hurd/htl/pt-sigstate.c index a501793..3f5bae9 100644 --- a/sysdeps/mach/hurd/htl/pt-sigstate.c +++ b/sysdeps/mach/hurd/htl/pt-sigstate.c @@ -28,58 +28,7 @@ error_t __pthread_sigstate (struct __pthread *thread, int how, const sigset_t *set, sigset_t *oset, int clear_pending) { - error_t err = 0; - struct hurd_sigstate *ss; - sigset_t old, new; - sigset_t pending; - - if (set != NULL) - new = *set; - - ss = _hurd_thread_sigstate (thread->kernel_thread); - assert (ss); - - _hurd_sigstate_lock (ss); - - old = ss->blocked; - - if (set != NULL) - { - switch (how) - { - case SIG_BLOCK: - ss->blocked |= new; - break; - - case SIG_SETMASK: - ss->blocked = new; - break; - - case SIG_UNBLOCK: - ss->blocked &= ~new; - break; - - default: - err = EINVAL; - break; - } - ss->blocked &= ~_SIG_CANT_MASK; - } - - if (!err && clear_pending) - __sigemptyset (&ss->pending); - - pending = _hurd_sigstate_pending (ss) & ~ss->blocked; - _hurd_sigstate_unlock (ss); - - if (!err && oset != NULL) - *oset = old; - - if (!err && pending) - /* Send a message to the signal thread so it - will wake up and check for pending signals. */ - __msg_sig_post (_hurd_msgport, 0, 0, __mach_task_self ()); - - return err; + return __sigthreadmask (_hurd_thread_sigstate (thread->kernel_thread), + how, set, oset, clear_pending); } libc_hidden_def (__pthread_sigstate) diff --git a/sysdeps/mach/hurd/sigprocmask.c b/sysdeps/mach/hurd/sigprocmask.c index c0737f2..1979fc1 100644 --- a/sysdeps/mach/hurd/sigprocmask.c +++ b/sysdeps/mach/hurd/sigprocmask.c @@ -27,56 +27,7 @@ int __sigprocmask (int how, const sigset_t *set, sigset_t *oset) { - struct hurd_sigstate *ss; - sigset_t old, new; - sigset_t pending; - - if (set != NULL) - new = *set; - - ss = _hurd_self_sigstate (); - - _hurd_sigstate_lock (ss); - - old = ss->blocked; - - if (set != NULL) - { - switch (how) - { - case SIG_BLOCK: - __sigorset (&ss->blocked, &ss->blocked, &new); - break; - - case SIG_UNBLOCK: - ss->blocked &= ~new; - break; - - case SIG_SETMASK: - ss->blocked = new; - break; - - default: - _hurd_sigstate_unlock (ss); - return __hurd_fail (EINVAL); - } - - ss->blocked &= ~_SIG_CANT_MASK; - } - - pending = _hurd_sigstate_pending (ss) & ~ss->blocked; - - _hurd_sigstate_unlock (ss); - - if (oset != NULL) - *oset = old; - - if (pending) - /* Send a message to the signal thread so it - will wake up and check for pending signals. */ - __msg_sig_post (_hurd_msgport, 0, 0, __mach_task_self ()); - - return 0; + return __hurd_fail (__sigthreadmask (_hurd_self_sigstate (), how, set, oset, 0)); } libc_hidden_def (__sigprocmask) diff --git a/sysdeps/mach/hurd/sigthreadmask.c b/sysdeps/mach/hurd/sigthreadmask.c new file mode 100644 index 0000000..d8e928b --- /dev/null +++ b/sysdeps/mach/hurd/sigthreadmask.c @@ -0,0 +1,84 @@ +/* Copyright (C) 1991-2025 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <https://www.gnu.org/licenses/>. */ + +#include <errno.h> +#include <signal.h> +#include <hurd.h> +#include <hurd/signal.h> +#include <hurd/msg.h> + +/* If SET is not NULL, modify the current set of blocked signals in SS + according to HOW, which may be SIG_BLOCK, SIG_UNBLOCK or SIG_SETMASK. + If OSET is not NULL, store the old set of blocked signals in *OSET. + If CLEAR_PENDING is non-zero, the pending set is cleared. */ +error_t +__sigthreadmask (struct hurd_sigstate *ss, int how, + const sigset_t *set, sigset_t *oset, int clear_pending) +{ + sigset_t old, new; + sigset_t pending; + + if (set != NULL) + new = *set; + + assert (ss); + + _hurd_sigstate_lock (ss); + + old = ss->blocked; + + if (set != NULL) + { + switch (how) + { + case SIG_BLOCK: + __sigorset (&ss->blocked, &ss->blocked, &new); + break; + + case SIG_UNBLOCK: + ss->blocked &= ~new; + break; + + case SIG_SETMASK: + ss->blocked = new; + break; + + default: + _hurd_sigstate_unlock (ss); + return EINVAL; + } + + ss->blocked &= ~_SIG_CANT_MASK; + } + + if (clear_pending) + __sigemptyset (&ss->pending); + + pending = _hurd_sigstate_pending (ss) & ~ss->blocked; + + _hurd_sigstate_unlock (ss); + + if (oset != NULL) + *oset = old; + + if (pending) + /* Send a message to the signal thread so it + will wake up and check for pending signals. */ + __msg_sig_post (_hurd_msgport, 0, 0, __mach_task_self ()); + + return 0; +} |