if (target->meta.type != UNIT_TARGET)
return 0;
- /* Only add the dependency if boths units are loaded, so that
+ /* Only add the dependency if both units are loaded, so that
* that loop check below is reliable */
if (u->meta.load_state != UNIT_LOADED ||
target->meta.load_state != UNIT_LOADED)
return 0;
+ /* If either side wants no automatic dependencies, then let's
+ * skip this */
+ if (!u->meta.default_dependencies ||
+ target->meta.default_dependencies)
+ return 0;
+
/* Don't create loops */
if (set_get(target->meta.dependencies[UNIT_BEFORE], u))
return 0;
}
static int unit_add_default_dependencies(Unit *u) {
+ static const UnitDependency deps[] = {
+ UNIT_REQUIRED_BY,
+ UNIT_REQUIRED_BY_OVERRIDABLE,
+ UNIT_WANTED_BY,
+ UNIT_BOUND_BY
+ };
+
Unit *target;
Iterator i;
int r;
+ unsigned k;
assert(u);
- SET_FOREACH(target, u->meta.dependencies[UNIT_REQUIRED_BY], i)
- if ((r = unit_add_default_target_dependency(u, target)) < 0)
- return r;
-
- SET_FOREACH(target, u->meta.dependencies[UNIT_REQUIRED_BY_OVERRIDABLE], i)
- if ((r = unit_add_default_target_dependency(u, target)) < 0)
- return r;
-
- SET_FOREACH(target, u->meta.dependencies[UNIT_WANTED_BY], i)
- if ((r = unit_add_default_target_dependency(u, target)) < 0)
- return r;
-
- SET_FOREACH(target, u->meta.dependencies[UNIT_BOUND_BY], i)
- if ((r = unit_add_default_target_dependency(u, target)) < 0)
- return r;
+ for (k = 0; k < ELEMENTSOF(deps); k++)
+ SET_FOREACH(target, u->meta.dependencies[deps[k]], i)
+ if ((r = unit_add_default_target_dependency(u, target)) < 0)
+ return r;
return 0;
}
return r;
}
+bool unit_condition_test(Unit *u) {
+ assert(u);
+
+ dual_timestamp_get(&u->meta.condition_timestamp);
+ u->meta.condition_result = condition_test_list(u->meta.conditions);
+
+ return u->meta.condition_result;
+}
+
/* Errors:
* -EBADR: This unit type does not support starting.
* -EALREADY: Unit is already started.
return -EALREADY;
/* If the conditions failed, don't do anything at all */
- if (!condition_test_list(u->meta.conditions)) {
+ if (!unit_condition_test(u)) {
log_debug("Starting of %s requested but condition failed. Ignoring.", u->meta.id);
return -EALREADY;
}
job_add_to_run_queue(u->meta.job);
/* Let's check whether this state change constitutes a
- * finished job, or maybe cotradicts a running job and
+ * finished job, or maybe contradicts a running job and
* hence needs to invalidate jobs. */
switch (u->meta.job->type) {