systemd/adapt: return G_SOURCE_REMOVE in time event callback

Differently from GLib timeout sources, systemd ones are always
one-shot and therefore we must return G_SOURCE_REMOVE in the callback,
otherwise the timer will be scheduled again.

In most cases things were working correctly because usually the
callback also unreferences the source event, but when this doesn't
happen the timer will trigger multiple times as reported in the bug
below.

https://bugzilla.redhat.com/show_bug.cgi?id=1278506

Fixes: 1b1222ffdf
This commit is contained in:
Beniamino Galvani 2015-11-08 11:08:31 +01:00
parent efe1d66c31
commit a74e98bfc6

View file

@ -166,21 +166,14 @@ sd_event_add_io (sd_event *e, sd_event_source **s, int fd, uint32_t events, sd_e
static gboolean
time_ready (struct sd_event_source *source)
{
int r;
gboolean result;
source->refcount++;
r = source->time.cb (source, source->time.usec, source->user_data);
if (r < 0 || source->refcount <= 1) {
source->id = 0;
result = G_SOURCE_REMOVE;
} else
result = G_SOURCE_CONTINUE;
source->time.cb (source, source->time.usec, source->user_data);
source->id = 0;
sd_event_source_unref (source);
return result;
return G_SOURCE_REMOVE;
}
int