diff --git a/oop.h b/oop.h index 2ab7c67940c157f71b18e3ccfe63fb77bcfabd07..6a27e70a6cd2a93b9a9a616e3ddaa25e31bc4b9e 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 421ddae16844c2b9dcd5121ed403a477eb09299e..9314adc41bdb088cb01963ea3572f34682c3d492 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; +}