diff options
-rw-r--r-- | src/linux/membarrier.c | 17 |
1 files changed, 9 insertions, 8 deletions
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); } |