while ((i=rs.blocks))
__wait(&rs.blocks, 0, i, 1);
- sigfillset(&set);
- __libc_sigprocmask(SIG_BLOCK, &set, &set);
+ __syscall(SYS_rt_sigprocmask, SIG_BLOCK, (uint64_t[]){-1}, &set, 8);
if (!rs.init) {
struct sigaction sa = {
+ .sa_flags = SA_SIGINFO | SA_RESTART,
.sa_sigaction = rsyscall_handler,
.sa_mask = set
};
sigfillset(&sa.sa_mask);
sa.sa_sigaction = rsyscall_handler;
__libc_sigaction(SIGSYSCALL, &sa, 0);
+ rs.init = 1;
}
rs.nr = nr;
}
/* Handle any lingering signals with no-op */
- __libc_sigprocmask(SIG_UNBLOCK, &set, &set);
+ __syscall(SYS_rt_sigprocmask, SIG_SETMASK, &set, &set, 8);
/* Resume other threads' signal handlers and wait for them */
rs.hold = 0;