diff options
author | David Herrmann <dh.herrmann@gmail.com> | 2013-11-20 07:54:24 +0100 |
---|---|---|
committer | David Herrmann <dh.herrmann@gmail.com> | 2013-11-20 16:19:58 +0100 |
commit | 0cc1125ae10a216f2b27cb2828849ac1beb6a1b1 (patch) | |
tree | 5c4ef38dc230fdbd80f27a12581e773f9f3b2a75 /src/libsystemd-bus/sd-event.c | |
parent | 6c1508b871965b2eba46d477e81a9c4e85b2bd00 (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.
Diffstat (limited to 'src/libsystemd-bus/sd-event.c')
-rw-r--r-- | src/libsystemd-bus/sd-event.c | 1 |
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); |