chiark / gitweb /
fully clean up job dependencies on abort, too
[elogind.git] / manager.c
index 600b89ccf5af9510b339e7e3d57c883cdc1e3e4f..3430b97bc10e7851ed791e1f36f733cec801ea8d 100644 (file)
--- a/manager.c
+++ b/manager.c
@@ -109,6 +109,24 @@ static void transaction_delete_unit(Manager *m, Unit *u) {
                 transaction_delete_job(m, j);
 }
 
                 transaction_delete_job(m, j);
 }
 
+static void transaction_clean_dependencies(Manager *m) {
+        Iterator i;
+        Job *j;
+
+        assert(m);
+
+        /* Drops all dependencies of all installed jobs */
+
+        HASHMAP_FOREACH(j, m->jobs, i) {
+                while (j->subject_list)
+                        job_dependency_free(j->subject_list);
+                while (j->object_list)
+                        job_dependency_free(j->object_list);
+        }
+
+        assert(!m->transaction_anchor);
+}
+
 static void transaction_abort(Manager *m) {
         Job *j;
 
 static void transaction_abort(Manager *m) {
         Job *j;
 
@@ -121,7 +139,8 @@ static void transaction_abort(Manager *m) {
                         job_free(j);
 
         assert(hashmap_isempty(m->transaction_jobs));
                         job_free(j);
 
         assert(hashmap_isempty(m->transaction_jobs));
-        assert(!m->transaction_anchor);
+
+        transaction_clean_dependencies(m);
 }
 
 static void transaction_find_jobs_that_matter_to_anchor(Manager *m, Job *j, unsigned generation) {
 }
 
 static void transaction_find_jobs_that_matter_to_anchor(Manager *m, Job *j, unsigned generation) {
@@ -539,14 +558,7 @@ static int transaction_apply(Manager *m, JobMode mode) {
         }
 
         /* As last step, kill all remaining job dependencies. */
         }
 
         /* As last step, kill all remaining job dependencies. */
-        HASHMAP_FOREACH(j, m->jobs, i) {
-                while (j->subject_list)
-                        job_dependency_free(j->subject_list);
-                while (j->object_list)
-                        job_dependency_free(j->object_list);
-        }
-
-        assert(!m->transaction_anchor);
+        transaction_clean_dependencies(m);
 
         return 0;
 
 
         return 0;