diff options
Diffstat (limited to 'src/core/unit.c')
-rw-r--r-- | src/core/unit.c | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/src/core/unit.c b/src/core/unit.c index 70a2b57fa3..2b356e2854 100644 --- a/src/core/unit.c +++ b/src/core/unit.c @@ -2876,13 +2876,32 @@ int unit_add_node_link(Unit *u, const char *what, bool wants) { } int unit_coldplug(Unit *u) { + Unit *other; + Iterator i; int r; assert(u); - if (UNIT_VTABLE(u)->coldplug) - if ((r = UNIT_VTABLE(u)->coldplug(u)) < 0) + /* Make sure we don't enter a loop, when coldplugging + * recursively. */ + if (u->coldplugged) + return 0; + + u->coldplugged = true; + + /* Make sure everything that we might pull in through + * triggering is coldplugged before us */ + SET_FOREACH(other, u->dependencies[UNIT_TRIGGERS], i) { + r = unit_coldplug(other); + if (r < 0) return r; + } + + if (UNIT_VTABLE(u)->coldplug) { + r = UNIT_VTABLE(u)->coldplug(u); + if (r < 0) + return r; + } if (u->job) { r = job_coldplug(u->job); |