Also port machines_by_leader to store PidRef-s.
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);
}
}
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;
}
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;
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;
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);
}
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);
return 0;
}
- machine = hashmap_get(m->machine_units, unit);
+ machine = hashmap_get(m->machines_by_unit, unit);
if (!machine)
return 0;
return 0;
}
- machine = hashmap_get(m->machine_units, unit);
+ machine = hashmap_get(m->machines_by_unit, unit);
if (!machine)
return 0;
return 0;
}
- machine = hashmap_get(m->machine_units, unit);
+ machine = hashmap_get(m->machines_by_unit, unit);
if (!machine)
return 0;
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;
}
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);
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);
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;
};
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;