summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Herrmann <dh.herrmann@gmail.com>2013-11-20 07:54:24 +0100
committerDavid Herrmann <dh.herrmann@gmail.com>2013-11-20 16:19:58 +0100
commit0cc1125ae10a216f2b27cb2828849ac1beb6a1b1 (patch)
tree5c4ef38dc230fdbd80f27a12581e773f9f3b2a75
parent6c1508b871965b2eba46d477e81a9c4e85b2bd00 (diff)
event: clear pending-state when re-arming timers
If a timer fires and is marked pending, but an application re-arms it before it is dispatched, we now clear the pending state. This fixes a bug where an application arms a timer, which fires and is marked pending. But before it is dispatched, the application loses interest in it and disables it. Now if the timer is re-armed and re-enabled later, it will be immediately dispatched as it is still marked pending. This behavior is unexpected, so avoid it by clearing pending state when re-arming timers. Note that applications have no way to clear pending state themselves, so there's no current workaround.
-rw-r--r--src/libsystemd-bus/sd-event.c1
1 files changed, 1 insertions, 0 deletions
diff --git a/src/libsystemd-bus/sd-event.c b/src/libsystemd-bus/sd-event.c
index 0996316986..d01e82d945 100644
--- a/src/libsystemd-bus/sd-event.c
+++ b/src/libsystemd-bus/sd-event.c
@@ -1241,6 +1241,7 @@ _public_ int sd_event_source_set_time(sd_event_source *s, uint64_t usec) {
return 0;
s->time.next = usec;
+ source_set_pending(s, false);
if (s->type == SOURCE_REALTIME) {
prioq_reshuffle(s->event->realtime_earliest, s, &s->time.earliest_index);