diff options
author | Lennart Poettering <lennart@poettering.net> | 2013-04-25 21:57:41 -0300 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2013-04-25 22:01:49 -0300 |
commit | 31afa0a44c2d7f93d837c840cdbd623982ac165f (patch) | |
tree | 054b8f0aa7aabfe01f02db08286793eeef8b7159 /src/core/unit.c | |
parent | 67fb4482acb0ecccb8a30e7ca49e5de28ba49eaf (diff) |
unit: rework stop pending logic
When a trigger unit wants to know if a stop is queued for it, we should
just check precisely that and do not check whether it is actually
stopped already. This is because we use these checks usually from state
change calls where the state variables are not updated yet.
This change splits unit_pending_inactive() into two calls
unit_inactive_or_pending() and unit_stop_pending(). The former checks
state and pending jobs, the latter only pending jobs.
Diffstat (limited to 'src/core/unit.c')
-rw-r--r-- | src/core/unit.c | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/src/core/unit.c b/src/core/unit.c index c0c3ce90a7..b4a4f8cd2e 100644 --- a/src/core/unit.c +++ b/src/core/unit.c @@ -1206,19 +1206,19 @@ static void unit_check_unneeded(Unit *u) { return; SET_FOREACH(other, u->dependencies[UNIT_REQUIRED_BY], i) - if (unit_pending_active(other)) + if (unit_active_or_pending(other)) return; SET_FOREACH(other, u->dependencies[UNIT_REQUIRED_BY_OVERRIDABLE], i) - if (unit_pending_active(other)) + if (unit_active_or_pending(other)) return; SET_FOREACH(other, u->dependencies[UNIT_WANTED_BY], i) - if (unit_pending_active(other)) + if (unit_active_or_pending(other)) return; SET_FOREACH(other, u->dependencies[UNIT_BOUND_BY], i) - if (unit_pending_active(other)) + if (unit_active_or_pending(other)) return; log_info_unit(u->id, "Service %s is not needed anymore. Stopping.", u->id); @@ -2651,21 +2651,30 @@ Unit *unit_following(Unit *u) { return NULL; } -bool unit_pending_inactive(Unit *u) { +bool unit_stop_pending(Unit *u) { assert(u); - /* Returns true if the unit is inactive or going down */ + /* This call does check the current state of the unit. It's + * hence useful to be called from state change calls of the + * unit itself, where the state isn't updated yet. This is + * different from unit_inactive_or_pending() which checks both + * the current state and for a queued job. */ - if (UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u))) - return true; + return u->job && u->job->type == JOB_STOP; +} + +bool unit_inactive_or_pending(Unit *u) { + assert(u); + + /* Returns true if the unit is inactive or going down */ - if (u->job && u->job->type == JOB_STOP) + if (unit_stop_pending(u)) return true; return false; } -bool unit_pending_active(Unit *u) { +bool unit_active_or_pending(Unit *u) { assert(u); /* Returns true if the unit is active or going up */ |