|
Zbigniew Jędrzejewski-Szmek |
f1004d |
From f95387cda829bc053992c398789ce3aa6f42f81e Mon Sep 17 00:00:00 2001
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
Date: Sat, 4 Oct 2014 23:17:45 -0400
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
Subject: [PATCH] sd-event: also update signal mask when disconnecting sources
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
---
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
src/libsystemd/sd-event/sd-event.c | 68 +++++++++++++++++++++-----------------
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
1 file changed, 38 insertions(+), 30 deletions(-)
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
diff --git a/src/libsystemd/sd-event/sd-event.c b/src/libsystemd/sd-event/sd-event.c
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
index c5f062b3e0..80a2ae97e8 100644
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
--- a/src/libsystemd/sd-event/sd-event.c
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
+++ b/src/libsystemd/sd-event/sd-event.c
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
@@ -598,6 +598,36 @@ static bool need_signal(sd_event *e, int signal) {
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
e->n_enabled_child_sources > 0);
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
}
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
+static int event_update_signal_fd(sd_event *e) {
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
+ struct epoll_event ev = {};
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
+ bool add_to_epoll;
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
+ int r;
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
+
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
+ assert(e);
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
+
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
+ add_to_epoll = e->signal_fd < 0;
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
+
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
+ r = signalfd(e->signal_fd, &e->sigset, SFD_NONBLOCK|SFD_CLOEXEC);
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
+ if (r < 0)
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
+ return -errno;
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
+
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
+ e->signal_fd = r;
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
+
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
+ if (!add_to_epoll)
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
+ return 0;
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
+
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
+ ev.events = EPOLLIN;
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
+ ev.data.ptr = INT_TO_PTR(SOURCE_SIGNAL);
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
+
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
+ r = epoll_ctl(e->epoll_fd, EPOLL_CTL_ADD, e->signal_fd, &ev;;
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
+ if (r < 0) {
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
+ e->signal_fd = safe_close(e->signal_fd);
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
+ return -errno;
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
+ }
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
+
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
+ return 0;
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
+}
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
+
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
static void source_disconnect(sd_event_source *s) {
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
sd_event *event;
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
@@ -640,6 +670,10 @@ static void source_disconnect(sd_event_source *s) {
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
/* If the signal was on and now it is off... */
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
if (s->enabled != SD_EVENT_OFF && !need_signal(s->event, s->signal.sig)) {
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
assert_se(sigdelset(&s->event->sigset, s->signal.sig) == 0);
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
+
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
+ (void) event_update_signal_fd(s->event);
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
+ /* If disabling failed, we might get a spurious event,
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
+ * but otherwise nothing bad should happen. */
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
}
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
}
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
@@ -654,6 +688,10 @@ static void source_disconnect(sd_event_source *s) {
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
/* We know the signal was on, if it is off now... */
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
if (!need_signal(s->event, SIGCHLD)) {
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
assert_se(sigdelset(&s->event->sigset, SIGCHLD) == 0);
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
+
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
+ (void) event_update_signal_fd(s->event);
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
+ /* If disabling failed, we might get a spurious event,
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
+ * but otherwise nothing bad should happen. */
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
}
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
}
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
@@ -929,36 +967,6 @@ fail:
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
return r;
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
}
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
-static int event_update_signal_fd(sd_event *e) {
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
- struct epoll_event ev = {};
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
- bool add_to_epoll;
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
- int r;
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
-
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
- assert(e);
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
-
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
- add_to_epoll = e->signal_fd < 0;
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
-
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
- r = signalfd(e->signal_fd, &e->sigset, SFD_NONBLOCK|SFD_CLOEXEC);
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
- if (r < 0)
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
- return -errno;
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
-
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
- e->signal_fd = r;
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
-
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
- if (!add_to_epoll)
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
- return 0;
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
-
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
- ev.events = EPOLLIN;
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
- ev.data.ptr = INT_TO_PTR(SOURCE_SIGNAL);
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
-
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
- r = epoll_ctl(e->epoll_fd, EPOLL_CTL_ADD, e->signal_fd, &ev;;
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
- if (r < 0) {
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
- e->signal_fd = safe_close(e->signal_fd);
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
- return -errno;
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
- }
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
-
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
- return 0;
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
-}
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
-
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
static int signal_exit_callback(sd_event_source *s, const struct signalfd_siginfo *si, void *userdata) {
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
assert(s);
|
|
Zbigniew Jędrzejewski-Szmek |
f1004d |
|