chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
sd-event: always call epoll_ctl() on mask-updates if edge-triggered
[elogind.git]
/
src
/
libsystemd
/
sd-event
/
sd-event.c
diff --git
a/src/libsystemd/sd-event/sd-event.c
b/src/libsystemd/sd-event/sd-event.c
index 06af962dfb8f4a945c8b49bb6f3cd9b5d0161296..a21f7db8ebc8d6ac3bf57a4b5065afc51faeb541 100644
(file)
--- 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->n_ref = 1;
s->event = e;
+ s->floating = floating;
s->type = type;
s->pending_index = s->prepare_index = PRIOQ_IDX_NULL;
s->type = type;
s->pending_index = s->prepare_index = PRIOQ_IDX_NULL;
- s->floating = floating;
if (!floating)
sd_event_ref(e);
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);
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) {
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;
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);
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;
}
goto finish;
}
+ timedout = m == 0;
+
dual_timestamp_get(&e->timestamp);
e->timestamp_boottime = now(CLOCK_BOOTTIME);
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) {
p = event_next_pending(e);
if (!p) {
- r =
1
;
+ r =
!timedout
;
goto finish;
}
goto finish;
}