chiark / gitweb /
Merge branch 'master' of ssh://git.freedesktop.org/git/systemd
[elogind.git] / src / unit.c
index bb2b8c2fe010cb917b2f1df95b622528b332cf81..695044a77f33e9a5e54069bac3fdee518c6cf6a8 100644 (file)
@@ -319,6 +319,10 @@ void unit_free(Unit *u) {
 
         bus_unit_send_removed_signal(u);
 
+        if (u->meta.load_state != UNIT_STUB)
+                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);
@@ -344,10 +348,6 @@ void unit_free(Unit *u) {
         if (u->meta.job)
                 job_free(u->meta.job);
 
-        if (u->meta.load_state != UNIT_STUB)
-                if (UNIT_VTABLE(u)->done)
-                        UNIT_VTABLE(u)->done(u);
-
         cgroup_bonding_free_list(u->meta.cgroup_bondings);
 
         for (d = 0; d < _UNIT_DEPENDENCY_MAX; d++)
@@ -969,56 +969,54 @@ void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns) {
                          * failed previously due to EAGAIN. */
                         job_add_to_run_queue(u->meta.job);
 
-                else {
-                        assert(u->meta.job->state == JOB_RUNNING);
 
-                        /* Let's check whether this state change
-                         * constitutes a finished job, or maybe
-                         * cotradicts a running job and hence needs to
-                         * invalidate jobs. */
+                /* Let's check whether this state change constitutes a
+                 * finished job, or maybe cotradicts a running job and
+                 * hence needs to invalidate jobs. */
 
-                        switch (u->meta.job->type) {
+                switch (u->meta.job->type) {
 
-                        case JOB_START:
-                        case JOB_VERIFY_ACTIVE:
+                case JOB_START:
+                case JOB_VERIFY_ACTIVE:
 
-                                if (UNIT_IS_ACTIVE_OR_RELOADING(ns))
-                                        job_finish_and_invalidate(u->meta.job, true);
-                                else if (ns != UNIT_ACTIVATING) {
-                                        unexpected = true;
-                                        job_finish_and_invalidate(u->meta.job, false);
-                                }
+                        if (UNIT_IS_ACTIVE_OR_RELOADING(ns))
+                                job_finish_and_invalidate(u->meta.job, true);
+                        else if (u->meta.job->state == JOB_RUNNING && ns != UNIT_ACTIVATING) {
+                                unexpected = true;
+                                job_finish_and_invalidate(u->meta.job, false);
+                        }
 
-                                break;
+                        break;
 
-                        case JOB_RELOAD:
-                        case JOB_RELOAD_OR_START:
+                case JOB_RELOAD:
+                case JOB_RELOAD_OR_START:
 
+                        if (u->meta.job->state == JOB_RUNNING) {
                                 if (ns == UNIT_ACTIVE)
                                         job_finish_and_invalidate(u->meta.job, true);
                                 else if (ns != UNIT_ACTIVATING && ns != UNIT_ACTIVE_RELOADING) {
                                         unexpected = true;
                                         job_finish_and_invalidate(u->meta.job, false);
                                 }
+                        }
 
-                                break;
+                        break;
 
-                        case JOB_STOP:
-                        case JOB_RESTART:
-                        case JOB_TRY_RESTART:
+                case JOB_STOP:
+                case JOB_RESTART:
+                case JOB_TRY_RESTART:
 
-                                if (ns == UNIT_INACTIVE)
-                                        job_finish_and_invalidate(u->meta.job, true);
-                                else if (ns != UNIT_DEACTIVATING) {
-                                        unexpected = true;
-                                        job_finish_and_invalidate(u->meta.job, false);
-                                }
+                        if (ns == UNIT_INACTIVE)
+                                job_finish_and_invalidate(u->meta.job, true);
+                        else if (u->meta.job->state == JOB_RUNNING && ns != UNIT_DEACTIVATING) {
+                                unexpected = true;
+                                job_finish_and_invalidate(u->meta.job, false);
+                        }
 
-                                break;
+                        break;
 
-                        default:
-                                assert_not_reached("Job type unknown");
-                        }
+                default:
+                        assert_not_reached("Job type unknown");
                 }
         }