]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
machined: rename machine_{units,leaders} to machines_by_*
authorMike Yuan <me@yhndnzj.com>
Fri, 20 Sep 2024 22:05:36 +0000 (00:05 +0200)
committerMike Yuan <me@yhndnzj.com>
Fri, 20 Sep 2024 22:35:38 +0000 (00:35 +0200)
Also port machines_by_leader to store PidRef-s.

src/machine/machine.c
src/machine/machined-dbus.c
src/machine/machined.c
src/machine/machined.h

index 91e0e6be3dd45f58284cec0922d825c63a9d99f9..036a5b4edbd8b1ed3da7b868ca806e94b011b733 100644 (file)
@@ -120,7 +120,7 @@ Machine* machine_free(Machine *m) {
         m->leader_pidfd_event_source = sd_event_source_disable_unref(m->leader_pidfd_event_source);
         if (pidref_is_set(&m->leader)) {
                 if (m->manager)
-                        (void) hashmap_remove_value(m->manager->machine_leaders, PID_TO_PTR(m->leader.pid), m);
+                        (void) hashmap_remove_value(m->manager->machines_by_leader, &m->leader, m);
                 pidref_done(&m->leader);
         }
 
@@ -470,7 +470,10 @@ static int machine_ensure_scope(Machine *m, sd_bus_message *properties, sd_bus_e
         }
 
         assert(m->unit);
-        hashmap_put(m->manager->machine_units, m->unit, m);
+
+        r = hashmap_ensure_put(&m->manager->machines_by_unit, &string_hash_ops, m->unit, m);
+        if (r < 0)
+                return r;
 
         return 0;
 }
@@ -518,7 +521,7 @@ int machine_start(Machine *m, sd_bus_message *properties, sd_bus_error *error) {
         if (m->started)
                 return 0;
 
-        r = hashmap_put(m->manager->machine_leaders, PID_TO_PTR(m->leader.pid), m);
+        r = hashmap_ensure_put(&m->manager->machines_by_leader, &pidref_hash_ops, &m->leader, m);
         if (r < 0)
                 return r;
 
@@ -705,6 +708,8 @@ void machine_release_unit(Machine *m) {
         if (!m->unit)
                 return;
 
+        assert(m->manager);
+
         if (m->referenced) {
                 _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
                 int r;
@@ -718,7 +723,7 @@ void machine_release_unit(Machine *m) {
                 m->referenced = false;
         }
 
-        (void) hashmap_remove(m->manager->machine_units, m->unit);
+        (void) hashmap_remove_value(m->manager->machines_by_unit, m->unit, m);
         m->unit = mfree(m->unit);
 }
 
index 97a8a67236bd02c7f81dc2118c5257cca0197cba..a44d8e759865b0cd48625021289585b9b11b4693 100644 (file)
@@ -169,7 +169,7 @@ static int method_get_machine_by_pid(sd_bus_message *message, void *userdata, sd
         r = manager_get_machine_by_pid(m, pid, &machine);
         if (r < 0)
                 return r;
-        if (!machine)
+        if (r == 0)
                 return sd_bus_error_setf(error, BUS_ERROR_NO_MACHINE_FOR_PID, "PID "PID_FMT" does not belong to any known machine", pid);
 
         p = machine_bus_path(machine);
@@ -1229,7 +1229,7 @@ int match_job_removed(sd_bus_message *message, void *userdata, sd_bus_error *err
                 return 0;
         }
 
-        machine = hashmap_get(m->machine_units, unit);
+        machine = hashmap_get(m->machines_by_unit, unit);
         if (!machine)
                 return 0;
 
@@ -1276,7 +1276,7 @@ int match_properties_changed(sd_bus_message *message, void *userdata, sd_bus_err
                 return 0;
         }
 
-        machine = hashmap_get(m->machine_units, unit);
+        machine = hashmap_get(m->machines_by_unit, unit);
         if (!machine)
                 return 0;
 
@@ -1298,7 +1298,7 @@ int match_unit_removed(sd_bus_message *message, void *userdata, sd_bus_error *er
                 return 0;
         }
 
-        machine = hashmap_get(m->machine_units, unit);
+        machine = hashmap_get(m->machines_by_unit, unit);
         if (!machine)
                 return 0;
 
@@ -1464,26 +1464,28 @@ int manager_job_is_active(Manager *manager, const char *path) {
         return true;
 }
 
-int manager_get_machine_by_pid(Manager *m, pid_t pid, Machine **machine) {
+int manager_get_machine_by_pid(Manager *m, pid_t pid, Machine **ret) {
         Machine *mm;
         int r;
 
         assert(m);
-        assert(pid >= 1);
-        assert(machine);
+        assert(pid_is_valid(pid));
+        assert(ret);
 
-        mm = hashmap_get(m->machine_leaders, PID_TO_PTR(pid));
+        mm = hashmap_get(m->machines_by_leader, &PIDREF_MAKE_FROM_PID(pid));
         if (!mm) {
                 _cleanup_free_ char *unit = NULL;
 
                 r = cg_pid_get_unit(pid, &unit);
                 if (r >= 0)
-                        mm = hashmap_get(m->machine_units, unit);
+                        mm = hashmap_get(m->machines_by_unit, unit);
         }
-        if (!mm)
+        if (!mm) {
+                *ret = NULL;
                 return 0;
+        }
 
-        *machine = mm;
+        *ret = mm;
         return 1;
 }
 
index 491f7c735e32ea30970c3b25a6ce8626f2c48468..a0c4ef751ae6475aced23b72b1f5101cda553454 100644 (file)
@@ -45,10 +45,7 @@ static int manager_new(Manager **ret) {
                 return -ENOMEM;
 
         m->machines = hashmap_new(&machine_hash_ops);
-        m->machine_units = hashmap_new(&string_hash_ops);
-        m->machine_leaders = hashmap_new(NULL);
-
-        if (!m->machines || !m->machine_units || !m->machine_leaders)
+        if (!m->machines)
                 return -ENOMEM;
 
         r = sd_event_default(&m->event);
@@ -83,9 +80,13 @@ static Manager* manager_unref(Manager *m) {
 
         assert(m->n_operations == 0);
 
-        hashmap_free(m->machines); /* This will free all machines, so that the machine_units/machine_leaders is empty */
-        hashmap_free(m->machine_units);
-        hashmap_free(m->machine_leaders);
+        hashmap_free(m->machines); /* This will free all machines, thus the by_unit/by_leader hashmaps shall be empty */
+
+        assert(hashmap_isempty(m->machines_by_unit));
+        hashmap_free(m->machines_by_unit);
+        assert(hashmap_isempty(m->machines_by_leader));
+        hashmap_free(m->machines_by_leader);
+
         hashmap_free(m->image_cache);
 
         sd_event_source_unref(m->image_cache_defer_event);
index 3dffcb9fe007f3ebe8a1f47e209604498781cc80..4ba54ebe201d9419cc409170461bedb2b888c808 100644 (file)
@@ -21,8 +21,8 @@ struct Manager {
         sd_bus *bus;
 
         Hashmap *machines;
-        Hashmap *machine_units;
-        Hashmap *machine_leaders;
+        Hashmap *machines_by_unit;
+        Hashmap *machines_by_leader;
 
         sd_event_source *deferred_gc_event_source;
 
@@ -43,7 +43,7 @@ struct Manager {
 };
 
 int manager_add_machine(Manager *m, const char *name, Machine **ret);
-int manager_get_machine_by_pid(Manager *m, pid_t pid, Machine **machine);
+int manager_get_machine_by_pid(Manager *m, pid_t pid, Machine **ret);
 
 extern const BusObjectImplementation manager_object;