mirror of
https://github.com/morgan9e/systemd
synced 2026-04-14 08:25:20 +09:00
machined: rename machine_{units,leaders} to machines_by_*
Also port machines_by_leader to store PidRef-s.
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user