X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Funit.c;h=0c92756cb7f7deb93aa2ace3f1a3bd60c10d53cc;hb=d04247cf25057cb5b3359244cd145e4027bd8536;hp=f786359fac3eb1e182a4fb44d5a9a99f5156db04;hpb=35d2e7ec19f8d3960a14dc04642060ccee3faa43;p=elogind.git diff --git a/src/unit.c b/src/unit.c index f786359fa..0c92756cb 100644 --- a/src/unit.c +++ b/src/unit.c @@ -949,6 +949,7 @@ static void retroactively_stop_dependencies(Unit *u) { void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns) { dual_timestamp ts; + bool unexpected; assert(u); assert(os < _UNIT_ACTIVE_STATE_MAX); @@ -983,7 +984,7 @@ void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns) { path_unit_notify(u, ns); if (u->meta.job) { - bool unexpected = false; + unexpected = false; if (u->meta.job->state == JOB_WAITING) @@ -1042,16 +1043,20 @@ void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns) { assert_not_reached("Job type unknown"); } - /* If this state change happened without being - * requested by a job, then let's retroactively start - * or stop dependencies */ - - 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); - } + } else + unexpected = true; + + /* If this state change happened without being requested by a + * job, then let's retroactively start or stop + * dependencies. We skip that step when deserializing, since + * we don't want to create any additional jobs just because + * something is already activated. */ + + if (unexpected && u->meta.manager->n_deserializing <= 0) { + 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); } /* Some names are special */