chiark / gitweb /
event: clear pending-state when re-arming timers
authorDavid Herrmann <dh.herrmann@gmail.com>
Wed, 20 Nov 2013 06:54:24 +0000 (07:54 +0100)
committerDavid Herrmann <dh.herrmann@gmail.com>
Wed, 20 Nov 2013 15:19:58 +0000 (16:19 +0100)
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.

src/libsystemd-bus/sd-event.c

index 0996316986a7d26378a6418ae81ecd1f0a651d5c..d01e82d94560695764f41a356fb5eef85ebd9681 100644 (file)
@@ -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);