chiark / gitweb /
activate: port to use new getpeername_pretty()/getsockname_pretty() calls
[elogind.git] / src / machine / machined.c
index 63915519c11cf0044f377806852098966fafc3f6..a5f529384befd2011e660b75148e0e723acc3cef 100644 (file)
@@ -46,14 +46,15 @@ Manager *manager_new(void) {
 
         m->machines = hashmap_new(string_hash_func, string_compare_func);
         m->machine_units = hashmap_new(string_hash_func, string_compare_func);
+        m->machine_leaders = hashmap_new(trivial_hash_func, trivial_compare_func);
 
-        r = sd_event_new(&m->event);
-        if (r < 0) {
+        if (!m->machines || !m->machine_units || !m->machine_leaders) {
                 manager_free(m);
                 return NULL;
         }
 
-        if (!m->machines || !m->machine_units) {
+        r = sd_event_new(&m->event);
+        if (r < 0) {
                 manager_free(m);
                 return NULL;
         }
@@ -71,6 +72,7 @@ void manager_free(Manager *m) {
 
         hashmap_free(m->machines);
         hashmap_free(m->machine_units);
+        hashmap_free(m->machine_leaders);
 
         sd_bus_unref(m->bus);
         sd_event_unref(m->event);
@@ -108,9 +110,10 @@ int manager_get_machine_by_pid(Manager *m, pid_t pid, Machine **machine) {
 
         r = cg_pid_get_unit(pid, &unit);
         if (r < 0)
-                return r;
+                mm = hashmap_get(m->machine_leaders, UINT_TO_PTR(pid));
+        else
+                mm = hashmap_get(m->machine_units, unit);
 
-        mm = hashmap_get(m->machine_units, unit);
         if (!mm)
                 return 0;
 
@@ -284,7 +287,7 @@ void manager_gc(Manager *m, bool drop_not_started) {
                 LIST_REMOVE(gc_queue, m->machine_gc_queue, machine);
                 machine->in_gc_queue = false;
 
-                if (machine_check_gc(machine, drop_not_started) == 0) {
+                if (!machine_check_gc(machine, drop_not_started)) {
                         machine_stop(machine);
                         machine_free(machine);
                 }