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;
+}