chiark / gitweb /
unit: when destructing units make sure we don't readd the unit to the gc queue after...
authorLennart Poettering <lennart@poettering.net>
Sat, 5 Jun 2010 00:16:20 +0000 (02:16 +0200)
committerLennart Poettering <lennart@poettering.net>
Sat, 5 Jun 2010 00:16:20 +0000 (02:16 +0200)
src/manager.c
src/unit.c

index e37aa836027ddb3da7da60a137b340daf21b091a..38964939c3336d1fdc9511ffb23e1b10cc3b7b93 100644 (file)
@@ -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) {
index 695044a77f33e9a5e54069bac3fdee518c6cf6a8..3bb41a42393880dd12c3899c72a220b09131e449 100644 (file)
@@ -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);