minor locking optimizations
[musl] / src / thread / __rsyscall.c
index 923db2b..e885d9e 100644 (file)
@@ -56,17 +56,18 @@ int __rsyscall(int nr, long a, long b, long c, long d, long e, long f)
        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;
@@ -86,7 +87,7 @@ int __rsyscall(int nr, long a, long b, long c, long d, long e, long f)
        }
 
        /* 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;