diff options
Diffstat (limited to 'src/signal')
-rw-r--r-- | src/signal/block.c | 44 | ||||
-rw-r--r-- | src/signal/raise.c | 4 | ||||
-rw-r--r-- | src/signal/siglongjmp.c | 4 |
3 files changed, 48 insertions, 4 deletions
diff --git a/src/signal/block.c b/src/signal/block.c new file mode 100644 index 00000000..d7f61001 --- /dev/null +++ b/src/signal/block.c @@ -0,0 +1,44 @@ +#include "pthread_impl.h" +#include "syscall.h" +#include <signal.h> + +static const unsigned long all_mask[] = { +#if ULONG_MAX == 0xffffffff && _NSIG == 129 + -1UL, -1UL, -1UL, -1UL +#elif ULONG_MAX == 0xffffffff + -1UL, -1UL +#else + -1UL +#endif +}; + +static const unsigned long app_mask[] = { +#if ULONG_MAX == 0xffffffff +#if _NSIG == 65 + 0x7fffffff, 0xfffffffc +#else + 0x7fffffff, 0xfffffffc, -1UL, -1UL +#endif +#else +#if _NSIG == 65 + 0xfffffffc7fffffff +#else + 0xfffffffc7fffffff, -1UL +#endif +#endif +}; + +void __block_all_sigs(void *set) +{ + __syscall(SYS_rt_sigprocmask, SIG_BLOCK, &all_mask, set, _NSIG/8); +} + +void __block_app_sigs(void *set) +{ + __syscall(SYS_rt_sigprocmask, SIG_BLOCK, &app_mask, set, _NSIG/8); +} + +void __restore_sigs(void *set) +{ + __syscall(SYS_rt_sigprocmask, SIG_SETMASK, set, 0, _NSIG/8); +} diff --git a/src/signal/raise.c b/src/signal/raise.c index b24dc741..6fa43bef 100644 --- a/src/signal/raise.c +++ b/src/signal/raise.c @@ -8,10 +8,10 @@ int raise(int sig) { int pid, tid, ret; sigset_t set; - __syscall(SYS_rt_sigprocmask, SIG_BLOCK, SIGALL_SET, &set, _NSIG/8); + __block_app_sigs(&set); tid = __syscall(SYS_gettid); pid = __syscall(SYS_getpid); ret = syscall(SYS_tgkill, pid, tid, sig); - __syscall(SYS_rt_sigprocmask, SIG_SETMASK, &set, 0, _NSIG/8); + __restore_sigs(&set); return ret; } diff --git a/src/signal/siglongjmp.c b/src/signal/siglongjmp.c index bbdde796..a7bcca24 100644 --- a/src/signal/siglongjmp.c +++ b/src/signal/siglongjmp.c @@ -2,10 +2,10 @@ #include <signal.h> #include <stdlib.h> #include "syscall.h" +#include "pthread_impl.h" _Noreturn void siglongjmp(sigjmp_buf buf, int ret) { - if (buf->__fl) __syscall(SYS_rt_sigprocmask, SIG_SETMASK, - buf->__ss, 0, _NSIG/8); + if (buf->__fl) __restore_sigs(buf->__ss); longjmp(buf->__jb, ret); } |