author | Rich Felker <dalias@aerifal.cx> | 2019年04月09日 17:51:54 -0400 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2019年04月09日 17:51:54 -0400 |
commit | a01ff71f7c43693ad4954d4ae7863df159cf4073 (patch) | |
tree | 08677f7822b7de58016b1c2b5dade67a8e5b7270 /src | |
parent | 77846800722914eeba170505c2e7f89e12a6beff (diff) | |
download | musl-a01ff71f7c43693ad4954d4ae7863df159cf4073.tar.gz |
-rw-r--r-- | src/linux/membarrier.c | 17 |
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); } |