chiark / gitweb /
Prep v220: Remove all source files, taht are not needed to build elogind.
[elogind.git] / src / libelogind / sd-event / sd-event.c
index 376477f275b90ffa6e9c310cd24e704c7dbbe170..76964aa0ccd71ac0aecdd4d19d38d076e5a75f0c 100644 (file)
@@ -33,6 +33,7 @@
 #include "missing.h"
 #include "set.h"
 #include "list.h"
+#include "signal-util.h"
 
 #include "sd-event.h"
 
@@ -467,21 +468,22 @@ static bool event_pid_changed(sd_event *e) {
         return e->original_pid != getpid();
 }
 
-static int source_io_unregister(sd_event_source *s) {
+static void source_io_unregister(sd_event_source *s) {
         int r;
 
         assert(s);
         assert(s->type == SOURCE_IO);
 
+        if (event_pid_changed(s->event))
+                return;
+
         if (!s->io.registered)
-                return 0;
+                return;
 
         r = epoll_ctl(s->event->epoll_fd, EPOLL_CTL_DEL, s->io.fd, NULL);
-        if (r < 0)
-                return -errno;
+        assert_log(r >= 0);
 
         s->io.registered = false;
-        return 0;
 }
 
 static int source_io_register(
@@ -603,6 +605,9 @@ static int event_update_signal_fd(sd_event *e) {
 
         assert(e);
 
+        if (event_pid_changed(e))
+                return 0;
+
         add_to_epoll = e->signal_fd < 0;
 
         r = signalfd(e->signal_fd, &e->sigset, SFD_NONBLOCK|SFD_CLOEXEC);
@@ -1450,10 +1455,7 @@ _public_ int sd_event_source_set_enabled(sd_event_source *s, int m) {
                 switch (s->type) {
 
                 case SOURCE_IO:
-                        r = source_io_unregister(s);
-                        if (r < 0)
-                                return r;
-
+                        source_io_unregister(s);
                         s->enabled = m;
                         break;
 
@@ -2377,7 +2379,6 @@ _public_ int sd_event_wait(sd_event *e, uint64_t timeout) {
                 }
 
                 r = -errno;
-
                 goto finish;
         }
 
@@ -2490,24 +2491,20 @@ _public_ int sd_event_run(sd_event *e, uint64_t timeout) {
         assert_return(e->state == SD_EVENT_INITIAL, -EBUSY);
 
         r = sd_event_prepare(e);
-        if (r > 0) {
-                r = sd_event_dispatch(e);
-                if (r < 0)
-                        return r;
-                else
-                        return 1;
-        } else if (r < 0)
-                return r;
+        if (r == 0)
+                /* There was nothing? Then wait... */
+                r = sd_event_wait(e, timeout);
 
-        r = sd_event_wait(e, timeout);
         if (r > 0) {
+                /* There's something now, then let's dispatch it */
                 r = sd_event_dispatch(e);
                 if (r < 0)
                         return r;
-                else
-                        return 1;
-        } else
-                return r;
+
+                return 1;
+        }
+
+        return r;
 }
 
 _public_ int sd_event_loop(sd_event *e) {