void unit_add_to_load_queue(Unit *u) {
assert(u);
+ assert(u->meta.type != _UNIT_TYPE_INVALID);
if (u->meta.load_state != UNIT_STUB || u->meta.in_load_queue)
return;
void unit_add_to_dbus_queue(Unit *u) {
assert(u);
+ assert(u->meta.type != _UNIT_TYPE_INVALID);
if (u->meta.load_state == UNIT_STUB || u->meta.in_dbus_queue || set_isempty(u->meta.manager->subscribed))
return;
other->meta.load_state != UNIT_FAILED)
return -EEXIST;
+ if (other->meta.job)
+ return -EEXIST;
+
+ if (unit_active_state(other) != UNIT_INACTIVE)
+ return -EEXIST;
+
/* Merge names */
merge_names(u, other);
for (d = 0; d < _UNIT_DEPENDENCY_MAX; d++)
merge_dependencies(u, other, d);
- unit_add_to_dbus_queue(u);
-
other->meta.load_state = UNIT_MERGED;
other->meta.merged_into = u;
+ /* If there is still some data attached to the other node, we
+ * don't need it anymore, and can free it. */
+ if (other->meta.load_state != UNIT_STUB)
+ if (UNIT_VTABLE(other)->done)
+ UNIT_VTABLE(other)->done(other);
+
+ unit_add_to_dbus_queue(u);
unit_add_to_cleanup_queue(other);
return 0;