From 9a175952c7203a19e8fb8e461ddd485ebddb0f3d Mon Sep 17 00:00:00 2001 From: Magnus Holmgren <holmgren@debian.org> Date: Fri, 4 Nov 2016 17:00:39 +0100 Subject: [PATCH] Add flag for using SA_RESTART. --- oop.h | 3 +++ signal.c | 12 +++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/oop.h b/oop.h index d5d82ac..7980f36 100644 --- a/oop.h +++ b/oop.h @@ -110,7 +110,10 @@ void oop_select_delete(oop_adapter_select *); /* Helper for event sources without signal handling. */ typedef struct oop_adapter_signal oop_adapter_signal; +#define OOP_SIGNAL_USE_RESTART 0x1 + oop_adapter_signal *oop_signal_new(oop_source *); +oop_adapter_signal *oop_signal_new_flags(oop_source *, int flags); void oop_signal_delete(oop_adapter_signal *); oop_source *oop_signal_source(oop_adapter_signal *); diff --git a/signal.c b/signal.c index 421ddae..2a16d21 100644 --- a/signal.c +++ b/signal.c @@ -32,6 +32,7 @@ struct oop_adapter_signal { oop_source *source; /* backing source */ struct sig_signal sig[OOP_NUM_SIGNALS]; int num_events; + int use_sa_restart; }; static struct oop_adapter_signal *sig_owner[OOP_NUM_SIGNALS]; @@ -137,6 +138,7 @@ static void sig_on_signal(oop_source *source,int sig, #ifdef SA_NODEFER act.sa_flags &= ~SA_NODEFER; #endif + if (s->use_sa_restart) act.sa_flags |= SA_RESTART; sigaction(sig,&act,NULL); } } @@ -173,7 +175,7 @@ static int fcntl_flag(int fd, int get_op, int set_op, int val) { return fcntl(fd,set_op,flags|val); } -oop_adapter_signal *oop_signal_new(oop_source *source) { +oop_adapter_signal *oop_signal_new_flags(oop_source *source, int flags) { int i; oop_adapter_signal * const s = oop_malloc(sizeof(*s)); if (NULL == s) return NULL; @@ -204,10 +206,18 @@ oop_adapter_signal *oop_signal_new(oop_source *source) { s->sig[i].active = 0; } + if (flags & OOP_SIGNAL_USE_RESTART) { + s->use_sa_restart = 1; + } + s->magic = MAGIC; return s; } +oop_adapter_signal *oop_signal_new(oop_source *source) { + return oop_signal_new_flags(source, 0); +} + void oop_signal_delete(oop_adapter_signal *s) { assert(0 == s->num_events && "cannot delete with signal handler"); s->magic = 0; -- GitLab