提交 3c0501d2 编写于 作者: R Rich Felker

in synccall, ignore the signal before any threads' signal handlers return

this protects against deadlock from spurious signals (e.g. sent by
another process) arriving after the controlling thread releases the
other threads from the sync operation.
上级 a731e410
...@@ -71,6 +71,10 @@ void __synccall(void (*func)(void *), void *ctx) ...@@ -71,6 +71,10 @@ void __synccall(void (*func)(void *), void *ctx)
sigqueue(self->pid, SIGSYNCCALL, (union sigval){0}); sigqueue(self->pid, SIGSYNCCALL, (union sigval){0});
while (sem_wait(&chaindone)); while (sem_wait(&chaindone));
sa.sa_flags = 0;
sa.sa_handler = SIG_IGN;
__libc_sigaction(SIGSYNCCALL, &sa, 0);
for (cur=head; cur; cur=cur->next) { for (cur=head; cur; cur=cur->next) {
sem_post(&cur->sem); sem_post(&cur->sem);
while (sem_wait(&cur->sem2)); while (sem_wait(&cur->sem2));
...@@ -82,10 +86,6 @@ void __synccall(void (*func)(void *), void *ctx) ...@@ -82,10 +86,6 @@ void __synccall(void (*func)(void *), void *ctx)
sem_post(&cur->sem); sem_post(&cur->sem);
} }
sa.sa_flags = 0;
sa.sa_handler = SIG_IGN;
__libc_sigaction(SIGSYNCCALL, &sa, 0);
__syscall(SYS_rt_sigprocmask, SIG_SETMASK, __syscall(SYS_rt_sigprocmask, SIG_SETMASK,
&oldmask, 0, _NSIG/8); &oldmask, 0, _NSIG/8);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册