X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flibelogind%2Fsd-event%2Fsd-event.c;h=76964aa0ccd71ac0aecdd4d19d38d076e5a75f0c;hb=ed3fd617456efb0aac69526e6350441415792420;hp=376477f275b90ffa6e9c310cd24e704c7dbbe170;hpb=f48dd74a8d39b6074f820f904953f5cece03b9b0;p=elogind.git diff --git a/src/libelogind/sd-event/sd-event.c b/src/libelogind/sd-event/sd-event.c index 376477f27..76964aa0c 100644 --- a/src/libelogind/sd-event/sd-event.c +++ b/src/libelogind/sd-event/sd-event.c @@ -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) {