unit: fix the race in deserialization.

unit_notify is fired in deserelization code (particulary in
service_set_state). Units passed in random order, and there is possibility,
that unit with StopWhenUnneeded=yes passed before it actual dependecies. In
that case unit will be stopped as unneeded, because deps in UNIT_INACTIVE state
yet.

So, reuse similar logic (unit.c:1421) to avoid this race
This commit is contained in:
Oleksii Shevchuk 2013-02-14 00:49:26 +02:00 committed by Lennart Poettering
parent 92094b75fb
commit bf6dcfa6a7

View file

@ -1517,7 +1517,8 @@ void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns, bool reload_su
/* Maybe we finished startup and are now ready for being
* stopped because unneeded? */
unit_check_unneeded(u);
if (u->manager->n_reloading <= 0)
unit_check_unneeded(u);
unit_add_to_dbus_queue(u);
unit_add_to_gc_queue(u);