Re: [systemd-devel] [PATCH 2/2] sd-event: update signal mask when disconnecting sources

2014-10-24 Thread Lennart Poettering
On Sun, 05.10.14 20:42, Zbigniew Jędrzejewski-Szmek (zbys...@in.waw.pl) wrote:

 ---
 Looks like 

This sentence is incomplete?

Otherwise looks great! Please commit!

 
  src/libsystemd/sd-event/sd-event.c | 68 
 +-
  1 file changed, 38 insertions(+), 30 deletions(-)
 
 diff --git a/src/libsystemd/sd-event/sd-event.c 
 b/src/libsystemd/sd-event/sd-event.c
 index c5f062b3e0..80a2ae97e8 100644
 --- a/src/libsystemd/sd-event/sd-event.c
 +++ b/src/libsystemd/sd-event/sd-event.c
 @@ -598,6 +598,36 @@ static bool need_signal(sd_event *e, int signal) {
  e-n_enabled_child_sources  0);
  }
  
 +static int event_update_signal_fd(sd_event *e) {
 +struct epoll_event ev = {};
 +bool add_to_epoll;
 +int r;
 +
 +assert(e);
 +
 +add_to_epoll = e-signal_fd  0;
 +
 +r = signalfd(e-signal_fd, e-sigset, SFD_NONBLOCK|SFD_CLOEXEC);
 +if (r  0)
 +return -errno;
 +
 +e-signal_fd = r;
 +
 +if (!add_to_epoll)
 +return 0;
 +
 +ev.events = EPOLLIN;
 +ev.data.ptr = INT_TO_PTR(SOURCE_SIGNAL);
 +
 +r = epoll_ctl(e-epoll_fd, EPOLL_CTL_ADD, e-signal_fd, ev);
 +if (r  0) {
 +e-signal_fd = safe_close(e-signal_fd);
 +return -errno;
 +}
 +
 +return 0;
 +}
 +
  static void source_disconnect(sd_event_source *s) {
  sd_event *event;
  
 @@ -640,6 +670,10 @@ static void source_disconnect(sd_event_source *s) {
  /* If the signal was on and now it is off... */
  if (s-enabled != SD_EVENT_OFF  
 !need_signal(s-event, s-signal.sig)) {
  assert_se(sigdelset(s-event-sigset, 
 s-signal.sig) == 0);
 +
 +(void) event_update_signal_fd(s-event);
 +/* If disabling failed, we might get a 
 spurious event,
 + * but otherwise nothing bad should happen. 
 */
  }
  }
  
 @@ -654,6 +688,10 @@ static void source_disconnect(sd_event_source *s) {
  /* We know the signal was on, if it is off 
 now... */
  if (!need_signal(s-event, SIGCHLD)) {
  
 assert_se(sigdelset(s-event-sigset, SIGCHLD) == 0);
 +
 +(void) 
 event_update_signal_fd(s-event);
 +/* If disabling failed, we might get 
 a spurious event,
 + * but otherwise nothing bad should 
 happen. */
  }
  }
  
 @@ -929,36 +967,6 @@ fail:
  return r;
  }
  
 -static int event_update_signal_fd(sd_event *e) {
 -struct epoll_event ev = {};
 -bool add_to_epoll;
 -int r;
 -
 -assert(e);
 -
 -add_to_epoll = e-signal_fd  0;
 -
 -r = signalfd(e-signal_fd, e-sigset, SFD_NONBLOCK|SFD_CLOEXEC);
 -if (r  0)
 -return -errno;
 -
 -e-signal_fd = r;
 -
 -if (!add_to_epoll)
 -return 0;
 -
 -ev.events = EPOLLIN;
 -ev.data.ptr = INT_TO_PTR(SOURCE_SIGNAL);
 -
 -r = epoll_ctl(e-epoll_fd, EPOLL_CTL_ADD, e-signal_fd, ev);
 -if (r  0) {
 -e-signal_fd = safe_close(e-signal_fd);
 -return -errno;
 -}
 -
 -return 0;
 -}
 -
  static int signal_exit_callback(sd_event_source *s, const struct 
 signalfd_siginfo *si, void *userdata) {
  assert(s);
  
 -- 
 2.1.1
 
 
 
 


Lennart

-- 
Lennart Poettering, Red Hat
___
systemd-devel mailing list
systemd-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/systemd-devel


[systemd-devel] [PATCH 2/2] sd-event: update signal mask when disconnecting sources

2014-10-05 Thread Zbigniew Jędrzejewski-Szmek
---
Looks like 

 src/libsystemd/sd-event/sd-event.c | 68 +-
 1 file changed, 38 insertions(+), 30 deletions(-)

diff --git a/src/libsystemd/sd-event/sd-event.c 
b/src/libsystemd/sd-event/sd-event.c
index c5f062b3e0..80a2ae97e8 100644
--- a/src/libsystemd/sd-event/sd-event.c
+++ b/src/libsystemd/sd-event/sd-event.c
@@ -598,6 +598,36 @@ static bool need_signal(sd_event *e, int signal) {
 e-n_enabled_child_sources  0);
 }
 
+static int event_update_signal_fd(sd_event *e) {
+struct epoll_event ev = {};
+bool add_to_epoll;
+int r;
+
+assert(e);
+
+add_to_epoll = e-signal_fd  0;
+
+r = signalfd(e-signal_fd, e-sigset, SFD_NONBLOCK|SFD_CLOEXEC);
+if (r  0)
+return -errno;
+
+e-signal_fd = r;
+
+if (!add_to_epoll)
+return 0;
+
+ev.events = EPOLLIN;
+ev.data.ptr = INT_TO_PTR(SOURCE_SIGNAL);
+
+r = epoll_ctl(e-epoll_fd, EPOLL_CTL_ADD, e-signal_fd, ev);
+if (r  0) {
+e-signal_fd = safe_close(e-signal_fd);
+return -errno;
+}
+
+return 0;
+}
+
 static void source_disconnect(sd_event_source *s) {
 sd_event *event;
 
@@ -640,6 +670,10 @@ static void source_disconnect(sd_event_source *s) {
 /* If the signal was on and now it is off... */
 if (s-enabled != SD_EVENT_OFF  
!need_signal(s-event, s-signal.sig)) {
 assert_se(sigdelset(s-event-sigset, 
s-signal.sig) == 0);
+
+(void) event_update_signal_fd(s-event);
+/* If disabling failed, we might get a 
spurious event,
+ * but otherwise nothing bad should happen. */
 }
 }
 
@@ -654,6 +688,10 @@ static void source_disconnect(sd_event_source *s) {
 /* We know the signal was on, if it is off 
now... */
 if (!need_signal(s-event, SIGCHLD)) {
 assert_se(sigdelset(s-event-sigset, 
SIGCHLD) == 0);
+
+(void) 
event_update_signal_fd(s-event);
+/* If disabling failed, we might get a 
spurious event,
+ * but otherwise nothing bad should 
happen. */
 }
 }
 
@@ -929,36 +967,6 @@ fail:
 return r;
 }
 
-static int event_update_signal_fd(sd_event *e) {
-struct epoll_event ev = {};
-bool add_to_epoll;
-int r;
-
-assert(e);
-
-add_to_epoll = e-signal_fd  0;
-
-r = signalfd(e-signal_fd, e-sigset, SFD_NONBLOCK|SFD_CLOEXEC);
-if (r  0)
-return -errno;
-
-e-signal_fd = r;
-
-if (!add_to_epoll)
-return 0;
-
-ev.events = EPOLLIN;
-ev.data.ptr = INT_TO_PTR(SOURCE_SIGNAL);
-
-r = epoll_ctl(e-epoll_fd, EPOLL_CTL_ADD, e-signal_fd, ev);
-if (r  0) {
-e-signal_fd = safe_close(e-signal_fd);
-return -errno;
-}
-
-return 0;
-}
-
 static int signal_exit_callback(sd_event_source *s, const struct 
signalfd_siginfo *si, void *userdata) {
 assert(s);
 
-- 
2.1.1

___
systemd-devel mailing list
systemd-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/systemd-devel