From 7359ad28320e3bdf80f405988cd265eb7f707c6b Mon Sep 17 00:00:00 2001 From: Per Cederqvist <ceder@lysator.liu.se> Date: Sun, 13 Jul 2003 11:07:42 +0000 Subject: [PATCH] (use_sa_restart): New static variable. (sig_on_signal): Add SA_RESTART if appropriate. (oop_signal_new): Don't just blindly set FD_CLOEXEC and O_NONBLOCK. Read the old settings first. (oop_signal_use_sa_restart): New function. Signed-off-by: Magnus Holmgren <magnus@kibibyte.se> --- oop.h | 1 + signal.c | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/oop.h b/oop.h index 2ab7c67..6a27e70 100644 --- a/oop.h +++ b/oop.h @@ -120,4 +120,5 @@ oop_adapter_signal *oop_signal_new(oop_source *); void oop_signal_delete(oop_adapter_signal *); oop_source *oop_signal_source(oop_adapter_signal *); +void oop_signal_use_sa_restart(void); #endif diff --git a/signal.c b/signal.c index 421ddae..9314adc 100644 --- a/signal.c +++ b/signal.c @@ -35,6 +35,7 @@ struct oop_adapter_signal { }; static struct oop_adapter_signal *sig_owner[OOP_NUM_SIGNALS]; +static int use_sa_restart = 0; static oop_adapter_signal *verify_source(oop_source *source) { oop_adapter_signal * const s = (oop_adapter_signal *) source; @@ -137,6 +138,7 @@ static void sig_on_signal(oop_source *source,int sig, #ifdef SA_NODEFER act.sa_flags &= ~SA_NODEFER; #endif + if (use_sa_restart) act.sa_flags |= SA_RESTART; sigaction(sig,&act,NULL); } } @@ -220,3 +222,10 @@ void oop_signal_delete(oop_adapter_signal *s) { oop_source *oop_signal_source(oop_adapter_signal *s) { return &s->oop; } + +void oop_signal_use_sa_restart(void) { + int i; + for (i = 0; i < OOP_NUM_SIGNALS; ++i) + assert(NULL == sig_owner[i] && "signal handler already registered"); + use_sa_restart = 1; +} -- GitLab