summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2013-10-18 01:43:11 +0200
committerLennart Poettering <lennart@poettering.net>2013-10-18 01:43:55 +0200
commitabc5fe72503fcc30998334e73c5d8e58f9a9d85e (patch)
treebb36fa425bfab5415b38994ced2813008e4362dd
parentb75b4db0af92514fce3955a1350b77c3c42e7f77 (diff)
bus: automatically flush bus queue when we exit the event loop
This way, we do not have to call it manually
-rw-r--r--src/hostname/hostnamed.c1
-rw-r--r--src/libsystemd-bus/bus-internal.h1
-rw-r--r--src/libsystemd-bus/bus-util.c2
-rw-r--r--src/libsystemd-bus/sd-bus.c17
-rw-r--r--src/timedate/timedated.c1
5 files changed, 19 insertions, 3 deletions
diff --git a/src/hostname/hostnamed.c b/src/hostname/hostnamed.c
index a8f0574ec..db0762140 100644
--- a/src/hostname/hostnamed.c
+++ b/src/hostname/hostnamed.c
@@ -665,7 +665,6 @@ int main(int argc, char *argv[]) {
goto finish;
}
- sd_bus_flush(bus);
r = 0;
finish:
diff --git a/src/libsystemd-bus/bus-internal.h b/src/libsystemd-bus/bus-internal.h
index 1726b6184..5f8298bbb 100644
--- a/src/libsystemd-bus/bus-internal.h
+++ b/src/libsystemd-bus/bus-internal.h
@@ -244,6 +244,7 @@ struct sd_bus {
sd_event_source *input_io_event_source;
sd_event_source *output_io_event_source;
sd_event_source *time_event_source;
+ sd_event_source *quit_event_source;
sd_event *event;
};
diff --git a/src/libsystemd-bus/bus-util.c b/src/libsystemd-bus/bus-util.c
index 0046b486c..c72610466 100644
--- a/src/libsystemd-bus/bus-util.c
+++ b/src/libsystemd-bus/bus-util.c
@@ -83,7 +83,7 @@ int bus_event_loop_with_idle(sd_event *e, sd_bus *bus, const char *name, usec_t
if (r == SD_EVENT_FINISHED)
break;
- r = sd_event_run(e, exiting ? (uint64_t) -1 : DEFAULT_EXIT_USEC);
+ r = sd_event_run(e, exiting ? (uint64_t) -1 : timeout);
if (r < 0)
return r;
diff --git a/src/libsystemd-bus/sd-bus.c b/src/libsystemd-bus/sd-bus.c
index 665f1e6c8..55d964ed8 100644
--- a/src/libsystemd-bus/sd-bus.c
+++ b/src/libsystemd-bus/sd-bus.c
@@ -2208,6 +2208,16 @@ static int prepare_callback(sd_event_source *s, void *userdata) {
return 1;
}
+static int quit_callback(sd_event_source *event, void *userdata) {
+ sd_bus *bus = userdata;
+
+ assert(event);
+
+ sd_bus_flush(bus);
+
+ return 1;
+}
+
int sd_bus_attach_event(sd_bus *bus, sd_event *event, int priority) {
int r;
@@ -2251,6 +2261,10 @@ int sd_bus_attach_event(sd_bus *bus, sd_event *event, int priority) {
if (r < 0)
goto fail;
+ r = sd_event_add_quit(event, quit_callback, bus, &bus->quit_event_source);
+ if (r < 0)
+ goto fail;
+
return 0;
fail:
@@ -2271,6 +2285,9 @@ int sd_bus_detach_event(sd_bus *bus) {
if (bus->time_event_source)
bus->time_event_source = sd_event_source_unref(bus->time_event_source);
+ if (bus->quit_event_source)
+ bus->quit_event_source = sd_event_source_unref(bus->quit_event_source);
+
if (bus->event)
bus->event = sd_event_unref(bus->event);
diff --git a/src/timedate/timedated.c b/src/timedate/timedated.c
index 61f8fc55b..2ead4b999 100644
--- a/src/timedate/timedated.c
+++ b/src/timedate/timedated.c
@@ -880,7 +880,6 @@ int main(int argc, char *argv[]) {
goto finish;
}
- sd_bus_flush(bus);
r = 0;
finish: