}
void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns) {
+ bool unexpected = false;
+
assert(u);
assert(os < _UNIT_ACTIVE_STATE_MAX);
assert(ns < _UNIT_ACTIVE_STATE_MAX);
case JOB_START:
case JOB_VERIFY_ACTIVE:
- if (UNIT_IS_ACTIVE_OR_RELOADING(ns)) {
+ if (UNIT_IS_ACTIVE_OR_RELOADING(ns))
job_finish_and_invalidate(u->meta.job, true);
- return;
- } else if (ns == UNIT_ACTIVATING)
- return;
- else
+ else if (ns != UNIT_ACTIVATING) {
+ unexpected = true;
job_finish_and_invalidate(u->meta.job, false);
+ }
break;
case JOB_RELOAD:
case JOB_RELOAD_OR_START:
- if (ns == UNIT_ACTIVE) {
+ if (ns == UNIT_ACTIVE)
job_finish_and_invalidate(u->meta.job, true);
- return;
- } else if (ns == UNIT_ACTIVATING || ns == UNIT_ACTIVE_RELOADING)
- return;
- else
+ else if (ns != UNIT_ACTIVATING && ns != UNIT_ACTIVE_RELOADING) {
+ unexpected = true;
job_finish_and_invalidate(u->meta.job, false);
+ }
break;
case JOB_RESTART:
case JOB_TRY_RESTART:
- if (ns == UNIT_INACTIVE) {
+ if (ns == UNIT_INACTIVE)
job_finish_and_invalidate(u->meta.job, true);
- return;
- } else if (ns == UNIT_DEACTIVATING)
- return;
- else
+ else if (ns != UNIT_DEACTIVATING) {
+ unexpected = true;
job_finish_and_invalidate(u->meta.job, false);
+ }
break;
/* If this state change happened without being requested by a
* job, then let's retroactively start or stop dependencies */
- if (UNIT_IS_INACTIVE_OR_DEACTIVATING(os) && UNIT_IS_ACTIVE_OR_ACTIVATING(ns))
- retroactively_start_dependencies(u);
- else if (UNIT_IS_ACTIVE_OR_ACTIVATING(os) && UNIT_IS_INACTIVE_OR_DEACTIVATING(ns))
- retroactively_stop_dependencies(u);
+ if (unexpected) {
+ if (UNIT_IS_INACTIVE_OR_DEACTIVATING(os) && UNIT_IS_ACTIVE_OR_ACTIVATING(ns))
+ retroactively_start_dependencies(u);
+ else if (UNIT_IS_ACTIVE_OR_ACTIVATING(os) && UNIT_IS_INACTIVE_OR_DEACTIVATING(ns))
+ retroactively_stop_dependencies(u);
+ }
if (!UNIT_IS_ACTIVE_OR_RELOADING(os) && UNIT_IS_ACTIVE_OR_RELOADING(ns)) {