mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2025-12-26 19:20:12 +01:00
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(cherry picked from commita74e98bfc6)
This commit is contained in:
parent
db6f8315e5
commit
ccc4b1dd54
1 changed files with 3 additions and 10 deletions
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue