diff --git a/src/import/importd.c b/src/import/importd.c index 3bfa3cdd752..2ecffdec4ed 100644 --- a/src/import/importd.c +++ b/src/import/importd.c @@ -1728,9 +1728,10 @@ static int manager_add_bus_objects(Manager *m) { } static bool manager_check_idle(void *userdata) { - Manager *m = userdata; + Manager *m = ASSERT_PTR(userdata); - return hashmap_isempty(m->transfers); + return hashmap_isempty(m->transfers) && + hashmap_isempty(m->polkit_registry); } static void manager_parse_env(Manager *m) { diff --git a/src/locale/localed.c b/src/locale/localed.c index c0d104578d4..062744519db 100644 --- a/src/locale/localed.c +++ b/src/locale/localed.c @@ -622,6 +622,12 @@ static int connect_bus(Context *c, sd_event *event, sd_bus **_bus) { return 0; } +static bool context_check_idle(void *userdata) { + Context *c = ASSERT_PTR(userdata); + + return hashmap_isempty(c->polkit_registry); +} + static int run(int argc, char *argv[]) { _cleanup_(context_clear) Context context = {}; _cleanup_(sd_event_unrefp) sd_event *event = NULL; @@ -662,7 +668,13 @@ static int run(int argc, char *argv[]) { if (r < 0) log_warning_errno(r, "Failed to send readiness notification, ignoring: %m"); - r = bus_event_loop_with_idle(event, bus, "org.freedesktop.locale1", DEFAULT_EXIT_USEC, NULL, NULL); + r = bus_event_loop_with_idle( + event, + bus, + "org.freedesktop.locale1", + DEFAULT_EXIT_USEC, + context_check_idle, + &context); if (r < 0) return log_error_errno(r, "Failed to run event loop: %m"); diff --git a/src/machine/machined.c b/src/machine/machined.c index d7087e4672c..398375bc5e2 100644 --- a/src/machine/machined.c +++ b/src/machine/machined.c @@ -311,7 +311,7 @@ static int manager_startup(Manager *m) { } static bool check_idle(void *userdata) { - Manager *m = userdata; + Manager *m = ASSERT_PTR(userdata); if (m->operations) return false; @@ -322,6 +322,9 @@ static bool check_idle(void *userdata) { if (varlink_server_current_connections(m->varlink_machine_server) > 0) return false; + if (!hashmap_isempty(m->polkit_registry)) + return false; + manager_gc(m, true); return hashmap_isempty(m->machines); diff --git a/src/portable/portabled.c b/src/portable/portabled.c index d46ac018a30..0286bf59e75 100644 --- a/src/portable/portabled.c +++ b/src/portable/portabled.c @@ -117,9 +117,10 @@ static int manager_startup(Manager *m) { } static bool check_idle(void *userdata) { - Manager *m = userdata; + Manager *m = ASSERT_PTR(userdata); - return !m->operations; + return !m->operations && + hashmap_isempty(m->polkit_registry); } static int run(int argc, char *argv[]) { diff --git a/src/timedate/timedated.c b/src/timedate/timedated.c index e3b4367ec05..b4cc5f9dd5f 100644 --- a/src/timedate/timedated.c +++ b/src/timedate/timedated.c @@ -1118,6 +1118,12 @@ static int connect_bus(Context *c, sd_event *event, sd_bus **_bus) { return 0; } +static bool context_check_idle(void *userdata) { + Context *c = ASSERT_PTR(userdata); + + return hashmap_isempty(c->polkit_registry); +} + static int run(int argc, char *argv[]) { _cleanup_(context_clear) Context context = {}; _cleanup_(sd_event_unrefp) sd_event *event = NULL; @@ -1164,7 +1170,13 @@ static int run(int argc, char *argv[]) { if (r < 0) log_warning_errno(r, "Failed to send readiness notification, ignoring: %m"); - r = bus_event_loop_with_idle(event, bus, "org.freedesktop.timedate1", DEFAULT_EXIT_USEC, NULL, NULL); + r = bus_event_loop_with_idle( + event, + bus, + "org.freedesktop.timedate1", + DEFAULT_EXIT_USEC, + context_check_idle, + &context); if (r < 0) return log_error_errno(r, "Failed to run event loop: %m");