From 92870c3b395a8cbcd256aaab28cd85336bb0502a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Fri, 5 Jan 2007 19:27:48 +0000 Subject: [PATCH] We always handled signals as if their SA_RESTART flag was set - but that's not the default case. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@19711 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/system/kernel/signal.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/system/kernel/signal.c b/src/system/kernel/signal.c index 84234a06f3..47a04a6a89 100644 --- a/src/system/kernel/signal.c +++ b/src/system/kernel/signal.c @@ -76,6 +76,7 @@ handle_signals(struct thread *thread) & ~atomic_get(&thread->sig_block_mask); struct sigaction *handler; bool reschedule = false; + bool restart = false; int32 i; // If SIGKILL[THR] are pending, we ignore other signals. @@ -110,6 +111,9 @@ handle_signals(struct thread *thread) TRACE(("Thread 0x%lx received signal %s\n", thread->id, sigstr[signal])); + if ((handler->sa_flags & SA_RESTART) != 0) + restart = true; + if (handler->sa_handler == SIG_IGN) { // signal is to be ignored // ToDo: apply zombie cleaning on SIGCHLD @@ -197,7 +201,10 @@ handle_signals(struct thread *thread) return reschedule; } - arch_check_syscall_restart(thread); + // only restart if SA_RESTART was set on at least one handler + if (restart) + arch_check_syscall_restart(thread); + return reschedule; }