core: Make sure cgroup_oom_queue is flushed on manager exit
The unit queues are not serialized/deserialized (they are recreated after reexec/reload instead). The destroyed units are not removed from the cgroup_oom_queue. That means the queue may contain possibly invalid pointers to released units. Fix this by removing the units from cgroup_oom_queue as we do for others. When at it, sync assert checks with currently existing queues and put them in order in the manager cleanup code.
This commit is contained in:
committed by
Dan Streetman
parent
869f52f218
commit
13e721036b
@@ -1437,6 +1437,10 @@ static void manager_clear_jobs_and_units(Manager *m) {
|
||||
assert(!m->cleanup_queue);
|
||||
assert(!m->gc_unit_queue);
|
||||
assert(!m->gc_job_queue);
|
||||
assert(!m->cgroup_realize_queue);
|
||||
assert(!m->cgroup_empty_queue);
|
||||
assert(!m->cgroup_oom_queue);
|
||||
assert(!m->target_deps_queue);
|
||||
assert(!m->stop_when_unneeded_queue);
|
||||
assert(!m->start_when_upheld_queue);
|
||||
assert(!m->stop_when_bound_queue);
|
||||
|
||||
+5
-2
@@ -733,6 +733,9 @@ Unit* unit_free(Unit *u) {
|
||||
if (u->in_dbus_queue)
|
||||
LIST_REMOVE(dbus_queue, u->manager->dbus_unit_queue, u);
|
||||
|
||||
if (u->in_cleanup_queue)
|
||||
LIST_REMOVE(cleanup_queue, u->manager->cleanup_queue, u);
|
||||
|
||||
if (u->in_gc_queue)
|
||||
LIST_REMOVE(gc_queue, u->manager->gc_unit_queue, u);
|
||||
|
||||
@@ -742,8 +745,8 @@ Unit* unit_free(Unit *u) {
|
||||
if (u->in_cgroup_empty_queue)
|
||||
LIST_REMOVE(cgroup_empty_queue, u->manager->cgroup_empty_queue, u);
|
||||
|
||||
if (u->in_cleanup_queue)
|
||||
LIST_REMOVE(cleanup_queue, u->manager->cleanup_queue, u);
|
||||
if (u->in_cgroup_oom_queue)
|
||||
LIST_REMOVE(cgroup_oom_queue, u->manager->cgroup_oom_queue, u);
|
||||
|
||||
if (u->in_target_deps_queue)
|
||||
LIST_REMOVE(target_deps_queue, u->manager->target_deps_queue, u);
|
||||
|
||||
Reference in New Issue
Block a user