From: Lennart Poettering Date: Sat, 5 Jun 2010 00:16:20 +0000 (+0200) Subject: unit: when destructing units make sure we don't readd the unit to the gc queue after... X-Git-Tag: v1~217 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=964e0949dd35ecc3fd908de7898b01ab37a13bbb unit: when destructing units make sure we don't readd the unit to the gc queue after we already removed it there --- diff --git a/src/manager.c b/src/manager.c index e37aa8360..38964939c 100644 --- a/src/manager.c +++ b/src/manager.c @@ -543,13 +543,24 @@ static void manager_clear_jobs_and_units(Manager *m) { assert(m); - manager_dispatch_cleanup_queue(m); - while ((j = hashmap_first(m->transaction_jobs))) job_free(j); while ((u = hashmap_first(m->units))) unit_free(u); + + manager_dispatch_cleanup_queue(m); + + assert(!m->load_queue); + assert(!m->run_queue); + assert(!m->dbus_unit_queue); + assert(!m->dbus_job_queue); + assert(!m->cleanup_queue); + assert(!m->gc_queue); + + assert(hashmap_isempty(m->transaction_jobs)); + assert(hashmap_isempty(m->jobs)); + assert(hashmap_isempty(m->units)); } void manager_free(Manager *m) { diff --git a/src/unit.c b/src/unit.c index 695044a77..3bb41a423 100644 --- a/src/unit.c +++ b/src/unit.c @@ -323,10 +323,15 @@ void unit_free(Unit *u) { if (UNIT_VTABLE(u)->done) UNIT_VTABLE(u)->done(u); - /* Detach from next 'bigger' objects */ SET_FOREACH(t, u->meta.names, i) hashmap_remove_value(u->meta.manager->units, t, u); + if (u->meta.job) + job_free(u->meta.job); + + for (d = 0; d < _UNIT_DEPENDENCY_MAX; d++) + bidi_set_free(u, u->meta.dependencies[d]); + if (u->meta.type != _UNIT_TYPE_INVALID) LIST_REMOVE(Meta, units_per_type, u->meta.manager->units_per_type[u->meta.type], &u->meta); @@ -344,15 +349,8 @@ void unit_free(Unit *u) { u->meta.manager->n_in_gc_queue--; } - /* Free data and next 'smaller' objects */ - if (u->meta.job) - job_free(u->meta.job); - cgroup_bonding_free_list(u->meta.cgroup_bondings); - for (d = 0; d < _UNIT_DEPENDENCY_MAX; d++) - bidi_set_free(u, u->meta.dependencies[d]); - free(u->meta.description); free(u->meta.fragment_path);