88#include "loop-utils.h"
99#include "safe-wrappers.h"
1010
11- bool
12- init_loop_data (LoopData * ld ) {
13- #ifdef HAS_EVENT_FD
14- ld -> wakeup_read_fd = eventfd (0 , EFD_CLOEXEC | EFD_NONBLOCK );
15- if (ld -> wakeup_read_fd < 0 ) return false;
16- #else
17- if (!self_pipe (ld -> wakeup_fds , true)) return false;
18- ld -> wakeup_read_fd = ld -> wakeup_fds [0 ];
19- #endif
20- ld -> signal_read_fd = -1 ;
21- #ifndef HAS_SIGNAL_FD
22- ld -> signal_fds [0 ] = -1 ; ld -> signal_fds [1 ] = -1 ;
23- #endif
24- return true;
25- }
26-
2711#ifndef HAS_SIGNAL_FD
2812static int signal_write_fd = -1 ;
2913
@@ -48,10 +32,44 @@ handle_signal(int sig_num UNUSED, siginfo_t *si, void *ucontext UNUSED) {
4832#endif
4933
5034
51- #define SIGNAL_SET \
52- sigset_t signals = {0}; \
53- sigemptyset(&signals); \
54- sigaddset(&signals, SIGINT); sigaddset(&signals, SIGTERM); sigaddset(&signals, SIGCHLD); sigaddset(&signals, SIGUSR1); sigaddset(&signals, SIGUSR2); \
35+ bool
36+ init_loop_data (LoopData * ld , size_t num_signals , ...) {
37+ ld -> num_handled_signals = num_signals ;
38+ va_list valist ;
39+ va_start (valist , num_signals );
40+ for (size_t i = 0 ; i < ld -> num_handled_signals ; i ++ ) {
41+ ld -> handled_signals [i ] = va_arg (valist , int );
42+ }
43+ va_end (valist );
44+ #ifdef HAS_EVENT_FD
45+ ld -> wakeup_read_fd = eventfd (0 , EFD_CLOEXEC | EFD_NONBLOCK );
46+ if (ld -> wakeup_read_fd < 0 ) return false;
47+ #else
48+ if (!self_pipe (ld -> wakeup_fds , true)) return false;
49+ ld -> wakeup_read_fd = ld -> wakeup_fds [0 ];
50+ #endif
51+ ld -> signal_read_fd = -1 ;
52+ #ifdef HAS_SIGNAL_FD
53+ sigemptyset (& ld -> signals );
54+ if (ld -> num_handled_signals ) {
55+ for (size_t i = 0 ; i < ld -> num_handled_signals ; i ++ ) sigaddset (& ld -> signals , ld -> handled_signals [i ]);
56+ if (sigprocmask (SIG_BLOCK , & ld -> signals , NULL ) == -1 ) return false;
57+ ld -> signal_read_fd = signalfd (-1 , & ld -> signals , SFD_NONBLOCK | SFD_CLOEXEC );
58+ if (ld -> signal_read_fd == -1 ) return false;
59+ }
60+ #else
61+ ld -> signal_fds [0 ] = -1 ; ld -> signal_fds [1 ] = -1 ;
62+ if (ld -> num_handled_signals ) {
63+ if (!self_pipe (ld -> signal_fds , true)) return false;
64+ signal_write_fd = ld -> signal_fds [1 ];
65+ ld -> signal_read_fd = ld -> signal_fds [0 ];
66+ struct sigaction act = {.sa_sigaction = handle_signal , .sa_flags = SA_SIGINFO | SA_RESTART };
67+ for (size_t i = 0 ; i < ld -> num_handled_signals ; i ++ ) { if (sigaction (ld -> handled_signals [i ], & act , NULL ) != 0 ) return false; }
68+ }
69+ #endif
70+ return true;
71+ }
72+
5573
5674void
5775free_loop_data (LoopData * ld ) {
@@ -60,22 +78,16 @@ free_loop_data(LoopData *ld) {
6078 CLOSE (wakeup_fds , 0 ); CLOSE (wakeup_fds , 1 );
6179#endif
6280#ifndef HAS_SIGNAL_FD
81+ signal_write_fd = -1 ;
6382 CLOSE (signal_fds , 0 ); CLOSE (signal_fds , 1 );
6483#endif
6584#undef CLOSE
6685 if (ld -> signal_read_fd > -1 ) {
6786#ifdef HAS_SIGNAL_FD
6887 safe_close (ld -> signal_read_fd , __FILE__ , __LINE__ );
69- SIGNAL_SET
70- sigprocmask (SIG_UNBLOCK , & signals , NULL );
71- #else
72- signal_write_fd = -1 ;
88+ sigprocmask (SIG_UNBLOCK , & ld -> signals , NULL );
7389#endif
74- signal (SIGINT , SIG_DFL );
75- signal (SIGTERM , SIG_DFL );
76- signal (SIGCHLD , SIG_DFL );
77- signal (SIGUSR1 , SIG_DFL );
78- signal (SIGUSR2 , SIG_DFL );
90+ for (size_t i = 0 ; i < ld -> num_handled_signals ; i ++ ) signal (ld -> num_handled_signals , SIG_DFL );
7991 }
8092#ifdef HAS_EVENT_FD
8193 safe_close (ld -> wakeup_read_fd , __FILE__ , __LINE__ );
@@ -102,26 +114,6 @@ wakeup_loop(LoopData *ld, bool in_signal_handler, const char *loop_name) {
102114}
103115
104116
105- bool
106- install_signal_handlers (LoopData * ld ) {
107- #ifdef HAS_SIGNAL_FD
108- SIGNAL_SET
109- if (sigprocmask (SIG_BLOCK , & signals , NULL ) == -1 ) return false ;
110- ld -> signal_read_fd = signalfd (-1 , & signals , SFD_NONBLOCK | SFD_CLOEXEC );
111- if (ld -> signal_read_fd == -1 ) return false;
112- #else
113- if (!self_pipe (ld -> signal_fds , true)) return false;
114- signal_write_fd = ld -> signal_fds [1 ];
115- struct sigaction act = {.sa_sigaction = handle_signal , .sa_flags = SA_SIGINFO | SA_RESTART };
116- #define SA (which ) { if (sigaction(which, &act, NULL) != 0) return false; }
117- SA (SIGINT ); SA (SIGTERM ); SA (SIGCHLD ); SA (SIGUSR1 ); SA (SIGUSR2 );
118- #undef SA
119- ld -> signal_read_fd = ld -> signal_fds [0 ];
120- #endif
121- return true;
122- }
123-
124-
125117void
126118read_signals (int fd , handle_signal_func callback , void * data ) {
127119#ifdef HAS_SIGNAL_FD
0 commit comments