X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Flinux%2Fmembarrier.c;h=9ebe906ed8b25d28590e2b909006969f4beee0c0;hb=114178dc8df79a5b1690ee1c7d6d90c79c76b6b7;hp=26d143e79cb026610183d99c26e27eb7fa6aaca8;hpb=ba18c1ecc6a18203ad8496791154af86f706f632;p=musl diff --git a/src/linux/membarrier.c b/src/linux/membarrier.c index 26d143e7..9ebe906e 100644 --- a/src/linux/membarrier.c +++ b/src/linux/membarrier.c @@ -44,17 +44,18 @@ int __membarrier(int cmd, int flags) .sa_handler = bcast_barrier }; memset(&sa.sa_mask, -1, sizeof sa.sa_mask); - __libc_sigaction(SIGSYNCCALL, &sa, 0); - for (td=self->next; td!=self; td=td->next) - __syscall(SYS_tkill, td->tid, SIGSYNCCALL); - for (td=self->next; td!=self; td=td->next) - sem_wait(&barrier_sem); - sa.sa_handler = SIG_IGN; - __libc_sigaction(SIGSYNCCALL, &sa, 0); + if (!__libc_sigaction(SIGSYNCCALL, &sa, 0)) { + for (td=self->next; td!=self; td=td->next) + __syscall(SYS_tkill, td->tid, SIGSYNCCALL); + for (td=self->next; td!=self; td=td->next) + sem_wait(&barrier_sem); + r = 0; + sa.sa_handler = SIG_IGN; + __libc_sigaction(SIGSYNCCALL, &sa, 0); + } sem_destroy(&barrier_sem); __tl_unlock(); __restore_sigs(&set); - return 0; } return __syscall_ret(r); }