chiark / gitweb /
bus: fix exit-on-idle for driverd
authorLennart Poettering <lennart@poettering.net>
Thu, 19 Dec 2013 20:14:52 +0000 (21:14 +0100)
committerLennart Poettering <lennart@poettering.net>
Thu, 19 Dec 2013 21:18:39 +0000 (22:18 +0100)
src/bus-driverd/bus-driverd.c
src/hostname/hostnamed.c
src/libsystemd-bus/bus-util.c
src/libsystemd-bus/bus-util.h
src/locale/localed.c
src/timedate/timedated.c

index d4126a9..46ee349 100644 (file)
@@ -772,6 +772,13 @@ static int connect_bus(Context *c) {
         return 0;
 }
 
+static bool check_idle(void *userdata) {
+        Context *c = userdata;
+        assert(c);
+
+        return hashmap_isempty(c->clients);
+}
+
 int main(int argc, char *argv[]) {
         Context context = {};
         Client *c;
@@ -799,7 +806,7 @@ int main(int argc, char *argv[]) {
         if (r < 0)
                 goto finish;
 
-        r = bus_event_loop_with_idle(context.event, context.bus, "org.freedesktop.DBus", DEFAULT_EXIT_USEC);
+        r = bus_event_loop_with_idle(context.event, context.bus, "org.freedesktop.DBus", DEFAULT_EXIT_USEC, check_idle, &context);
         if (r < 0) {
                 log_error("Failed to run event loop: %s", strerror(-r));
                 goto finish;
index eb2b35f..e57891b 100644 (file)
@@ -639,7 +639,7 @@ int main(int argc, char *argv[]) {
                 goto finish;
         }
 
-        r = bus_event_loop_with_idle(event, bus, "org.freedesktop.hostname1", DEFAULT_EXIT_USEC);
+        r = bus_event_loop_with_idle(event, bus, "org.freedesktop.hostname1", DEFAULT_EXIT_USEC, NULL, NULL);
         if (r < 0) {
                 log_error("Failed to run event loop: %s", strerror(-r));
                 goto finish;
index 4c87e16..f96c293 100644 (file)
@@ -87,7 +87,13 @@ int bus_async_unregister_and_exit(sd_event *e, sd_bus *bus, const char *name) {
         return 0;
 }
 
-int bus_event_loop_with_idle(sd_event *e, sd_bus *bus, const char *name, usec_t timeout) {
+int bus_event_loop_with_idle(
+                sd_event *e,
+                sd_bus *bus,
+                const char *name,
+                usec_t timeout,
+                check_idle_t check_idle,
+                void *userdata) {
         bool exiting = false;
         int r, code;
 
@@ -96,14 +102,20 @@ int bus_event_loop_with_idle(sd_event *e, sd_bus *bus, const char *name, usec_t
         assert(name);
 
         for (;;) {
+                bool idle;
+
                 r = sd_event_get_state(e);
                 if (r < 0)
                         return r;
-
                 if (r == SD_EVENT_FINISHED)
                         break;
 
-                r = sd_event_run(e, exiting ? (uint64_t) -1 : timeout);
+                if (check_idle)
+                        idle = check_idle(userdata);
+                else
+                        idle = true;
+
+                r = sd_event_run(e, exiting || !idle ? (uint64_t) -1 : timeout);
                 if (r < 0)
                         return r;
 
index 9a90c2a..51e1613 100644 (file)
@@ -54,7 +54,9 @@ int bus_map_all_properties(sd_bus *bus,
 
 int bus_async_unregister_and_exit(sd_event *e, sd_bus *bus, const char *name);
 
-int bus_event_loop_with_idle(sd_event *e, sd_bus *bus, const char *name, usec_t timeout);
+typedef bool (*check_idle_t)(void *userdata);
+
+int bus_event_loop_with_idle(sd_event *e, sd_bus *bus, const char *name, usec_t timeout, check_idle_t check_idle, void *userdata);
 
 int bus_name_has_owner(sd_bus *c, const char *name, sd_bus_error *error);
 
index 2c90180..a1e0ab6 100644 (file)
@@ -1149,7 +1149,7 @@ int main(int argc, char *argv[]) {
                 goto finish;
         }
 
-        r = bus_event_loop_with_idle(event, bus, "org.freedesktop.locale1", DEFAULT_EXIT_USEC);
+        r = bus_event_loop_with_idle(event, bus, "org.freedesktop.locale1", DEFAULT_EXIT_USEC, NULL, NULL);
         if (r < 0) {
                 log_error("Failed to run event loop: %s", strerror(-r));
                 goto finish;
index 8ac933c..d85ce57 100644 (file)
@@ -857,7 +857,7 @@ int main(int argc, char *argv[]) {
                 goto finish;
         }
 
-        r = bus_event_loop_with_idle(event, bus, "org.freedesktop.timedate1", DEFAULT_EXIT_USEC);
+        r = bus_event_loop_with_idle(event, bus, "org.freedesktop.timedate1", DEFAULT_EXIT_USEC, NULL, NULL);
         if (r < 0) {
                 log_error("Failed to run event loop: %s", strerror(-r));
                 goto finish;