From: David Herrmann Date: Wed, 20 Nov 2013 06:54:24 +0000 (+0100) Subject: event: clear pending-state when re-arming timers X-Git-Tag: v209~1398 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=0cc1125ae10a216f2b27cb2828849ac1beb6a1b1 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. --- diff --git a/src/libsystemd-bus/sd-event.c b/src/libsystemd-bus/sd-event.c index 099631698..d01e82d94 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);