X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Flibsystemd%2Fsd-event%2Fsd-event.c;h=a21f7db8ebc8d6ac3bf57a4b5065afc51faeb541;hp=06af962dfb8f4a945c8b49bb6f3cd9b5d0161296;hb=b63c8d4f0364457b0ead8793504012bb7113974f;hpb=a71fe8b8aee1cb78c4d8c56eeb234743f64e4b4d diff --git a/src/libsystemd/sd-event/sd-event.c b/src/libsystemd/sd-event/sd-event.c index 06af962df..a21f7db8e 100644 --- a/src/libsystemd/sd-event/sd-event.c +++ b/src/libsystemd/sd-event/sd-event.c @@ -718,9 +718,9 @@ static sd_event_source *source_new(sd_event *e, bool floating, EventSourceType t s->n_ref = 1; s->event = e; + s->floating = floating; s->type = type; s->pending_index = s->prepare_index = PRIOQ_IDX_NULL; - s->floating = floating; if (!floating) sd_event_ref(e); @@ -1282,7 +1282,8 @@ _public_ int sd_event_source_set_io_events(sd_event_source *s, uint32_t events) assert_return(s->event->state != SD_EVENT_FINISHED, -ESTALE); assert_return(!event_pid_changed(s->event), -ECHILD); - if (s->io.events == events) + /* edge-triggered updates are never skipped, so we can reset edges */ + if (s->io.events == events && !(events & EPOLLET)) return 0; if (s->enabled != SD_EVENT_OFF) { @@ -2180,6 +2181,7 @@ _public_ int sd_event_run(sd_event *e, uint64_t timeout) { unsigned ev_queue_max; sd_event_source *p; int r, i, m; + bool timedout; assert_return(e, -EINVAL); assert_return(!event_pid_changed(e), -ECHILD); @@ -2226,6 +2228,8 @@ _public_ int sd_event_run(sd_event *e, uint64_t timeout) { goto finish; } + timedout = m == 0; + dual_timestamp_get(&e->timestamp); e->timestamp_boottime = now(CLOCK_BOOTTIME); @@ -2278,7 +2282,7 @@ _public_ int sd_event_run(sd_event *e, uint64_t timeout) { p = event_next_pending(e); if (!p) { - r = 1; + r = !timedout; goto finish; }