For one thing, we always block the same signals (IRQ ones - IO, WINCH, VTALRM), so there's no need to pass sa_mask elements in arguments. For another, the flags depend only on whether it's an IRQ signal or not (we add SA_RESTART for them).
Signed-off-by: Al Viro <v...@zeniv.linux.org.uk> --- arch/um/include/shared/os.h | 2 +- arch/um/os-Linux/process.c | 19 ++++++------------- arch/um/os-Linux/signal.c | 22 +++++++++++----------- arch/um/os-Linux/skas/process.c | 3 +-- 4 files changed, 19 insertions(+), 27 deletions(-) diff --git a/arch/um/include/shared/os.h b/arch/um/include/shared/os.h index 2e2663a..598ca82 100644 --- a/arch/um/include/shared/os.h +++ b/arch/um/include/shared/os.h @@ -225,7 +225,7 @@ extern char *get_umid(void); extern void timer_init(void); extern void set_sigstack(void *sig_stack, int size); extern void remove_sigstack(void); -extern void set_handler(int sig, void (*handler)(int), int flags, ...); +extern void set_handler(int sig, void (*handler)(int)); extern int change_sig(int signal, int on); extern void block_signals(void); extern void unblock_signals(void); diff --git a/arch/um/os-Linux/process.c b/arch/um/os-Linux/process.c index c1a8fa7..075ae92 100644 --- a/arch/um/os-Linux/process.c +++ b/arch/um/os-Linux/process.c @@ -235,20 +235,13 @@ out: void init_new_thread_signals(void) { - set_handler(SIGSEGV, (__sighandler_t) sig_handler, SA_ONSTACK, - SIGIO, SIGWINCH, SIGVTALRM, -1); - set_handler(SIGTRAP, (__sighandler_t) sig_handler, SA_ONSTACK, - SIGIO, SIGWINCH, SIGVTALRM, -1); - set_handler(SIGFPE, (__sighandler_t) sig_handler, SA_ONSTACK, - SIGIO, SIGWINCH, SIGVTALRM, -1); - set_handler(SIGILL, (__sighandler_t) sig_handler, SA_ONSTACK, - SIGIO, SIGWINCH, SIGVTALRM, -1); - set_handler(SIGBUS, (__sighandler_t) sig_handler, SA_ONSTACK, - SIGIO, SIGWINCH, SIGVTALRM, -1); + set_handler(SIGSEGV, (__sighandler_t) sig_handler); + set_handler(SIGTRAP, (__sighandler_t) sig_handler); + set_handler(SIGFPE, (__sighandler_t) sig_handler); + set_handler(SIGILL, (__sighandler_t) sig_handler); + set_handler(SIGBUS, (__sighandler_t) sig_handler); signal(SIGHUP, SIG_IGN); - - set_handler(SIGIO, (__sighandler_t) sig_handler, - SA_ONSTACK | SA_RESTART, SIGIO, SIGWINCH, SIGVTALRM, -1); + set_handler(SIGIO, (__sighandler_t) sig_handler); signal(SIGWINCH, SIG_IGN); signal(SIGTERM, SIG_DFL); } diff --git a/arch/um/os-Linux/signal.c b/arch/um/os-Linux/signal.c index 75c3e9c..f248fb2 100644 --- a/arch/um/os-Linux/signal.c +++ b/arch/um/os-Linux/signal.c @@ -111,8 +111,7 @@ void alarm_handler(int sig, struct sigcontext *sc) void timer_init(void) { - set_handler(SIGVTALRM, (__sighandler_t) alarm_handler, - SA_ONSTACK | SA_RESTART, SIGIO, SIGWINCH, -1); + set_handler(SIGVTALRM, (__sighandler_t) alarm_handler); } void set_sigstack(void *sig_stack, int size) @@ -174,27 +173,28 @@ static void hard_handler(int sig, siginfo_t *info, void *p) handle_signal(sig, (struct sigcontext *) &uc->uc_mcontext); } -void set_handler(int sig, void (*handler)(int), int flags, ...) +void set_handler(int sig, void (*handler)(int)) { struct sigaction action; - va_list ap; + int flags = SA_SIGINFO | SA_ONSTACK; sigset_t sig_mask; - int mask; handlers[sig] = (void (*)(int, struct sigcontext *)) handler; action.sa_sigaction = hard_handler; + /* block irq ones */ sigemptyset(&action.sa_mask); - - va_start(ap, flags); - while ((mask = va_arg(ap, int)) != -1) - sigaddset(&action.sa_mask, mask); - va_end(ap); + sigaddset(&action.sa_mask, SIGVTALRM); + sigaddset(&action.sa_mask, SIGIO); + sigaddset(&action.sa_mask, SIGWINCH); if (sig == SIGSEGV) flags |= SA_NODEFER; - action.sa_flags = flags | SA_SIGINFO; + if (sigismember(&action.sa_mask, sig)) + flags |= SA_RESTART; /* if it's an irq signal */ + + action.sa_flags = flags; action.sa_restorer = NULL; if (sigaction(sig, &action, NULL) < 0) panic("sigaction failed - errno = %d\n", errno); diff --git a/arch/um/os-Linux/skas/process.c b/arch/um/os-Linux/skas/process.c index 6f9fc0d..8515fdd 100644 --- a/arch/um/os-Linux/skas/process.c +++ b/arch/um/os-Linux/skas/process.c @@ -642,8 +642,7 @@ int start_idle_thread(void *stack, jmp_buf *switch_buf) { int n; - set_handler(SIGWINCH, (__sighandler_t) sig_handler, - SA_ONSTACK | SA_RESTART, SIGIO, SIGVTALRM, -1); + set_handler(SIGWINCH, (__sighandler_t) sig_handler); /* * Can't use UML_SETJMP or UML_LONGJMP here because they save -- 1.7.2.5 ------------------------------------------------------------------------------ Get a FREE DOWNLOAD! and learn more about uberSVN rich system, user administration capabilities and model configuration. Take the hassle out of deploying and managing Subversion and the tools developers use with it. http://p.sf.net/sfu/wandisco-d2d-2 _______________________________________________ User-mode-linux-devel mailing list User-mode-linux-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/user-mode-linux-devel