Skip to content

Commit c004fd1

Browse files
committed
Declare the set of handled signals in only one place
1 parent f29039d commit c004fd1

File tree

4 files changed

+49
-55
lines changed

4 files changed

+49
-55
lines changed

kitty/child-monitor.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -137,8 +137,7 @@ new(PyTypeObject *type, PyObject *args, PyObject UNUSED *kwds) {
137137
return NULL;
138138
}
139139
self = (ChildMonitor *)type->tp_alloc(type, 0);
140-
if (!init_loop_data(&self->io_loop_data)) return PyErr_SetFromErrno(PyExc_OSError);
141-
if (!install_signal_handlers(&self->io_loop_data)) return PyErr_SetFromErrno(PyExc_OSError);
140+
if (!init_loop_data(&self->io_loop_data, 5, SIGINT, SIGTERM, SIGCHLD, SIGUSR1, SIGUSR2)) return PyErr_SetFromErrno(PyExc_OSError);
142141
self->talk_fd = talk_fd;
143142
self->listen_fd = listen_fd;
144143
if (self == NULL) return PyErr_NoMemory();
@@ -1605,7 +1604,7 @@ talk_loop(void *data) {
16051604
// The talk thread loop
16061605
ChildMonitor *self = (ChildMonitor*)data;
16071606
set_thread_name("KittyPeerMon");
1608-
if (!init_loop_data(&talk_data.loop_data)) { log_error("Failed to create wakeup fd for talk thread with error: %s", strerror(errno)); }
1607+
if (!init_loop_data(&talk_data.loop_data, 0)) { log_error("Failed to create wakeup fd for talk thread with error: %s", strerror(errno)); }
16091608
PollFD fds[PEER_LIMIT + 8] = {{0}};
16101609
size_t num_listen_fds = 0, num_peer_fds = 0;
16111610
#define add_listener(which) \

kitty/disk-cache.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@ ensure_state(DiskCache *self) {
329329
int ret;
330330
if (self->fully_initialized) return true;
331331
if (!self->loop_data_inited) {
332-
if (!init_loop_data(&self->loop_data)) { PyErr_SetFromErrno(PyExc_OSError); return false; }
332+
if (!init_loop_data(&self->loop_data, 0)) { PyErr_SetFromErrno(PyExc_OSError); return false; }
333333
self->loop_data_inited = true;
334334
}
335335
if (!self->currently_writing.hash_key) {

kitty/loop-utils.c

Lines changed: 41 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,6 @@
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
2812
static 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

5674
void
5775
free_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-
125117
void
126118
read_signals(int fd, handle_signal_func callback, void *data) {
127119
#ifdef HAS_SIGNAL_FD

kitty/loop-utils.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,16 +34,19 @@ typedef struct {
3434
#endif
3535
#ifndef HAS_SIGNAL_FD
3636
int signal_fds[2];
37+
#else
38+
sigset_t signals;
3739
#endif
3840
int wakeup_read_fd;
3941
int signal_read_fd;
42+
int handled_signals[16];
43+
size_t num_handled_signals;
4044
} LoopData;
4145
typedef void(*handle_signal_func)(const siginfo_t* siginfo, void *data);
4246

43-
bool init_loop_data(LoopData *ld);
47+
bool init_loop_data(LoopData *ld, size_t num_handled_signals, ...);
4448
void free_loop_data(LoopData *ld);
4549
void wakeup_loop(LoopData *ld, bool in_signal_handler, const char*);
46-
bool install_signal_handlers(LoopData *ld);
4750
void read_signals(int fd, handle_signal_func callback, void *data);
4851

4952
static inline bool

0 commit comments

Comments
 (0)