timer: make sure we restart timers even if units are still running or if one of their conditions fails
This commit is contained in:
parent
0e99f1d6f8
commit
e41e194340
6
TODO
6
TODO
|
@ -24,12 +24,6 @@ Fedora 19:
|
||||||
* localed:
|
* localed:
|
||||||
- localectl: support new converted x11→console keymaps
|
- localectl: support new converted x11→console keymaps
|
||||||
|
|
||||||
* timer logic is confused by units which are skipped due to failing condition
|
|
||||||
http://lists.freedesktop.org/archives/systemd-devel/2013-February/008816.html
|
|
||||||
|
|
||||||
* timer logic is also confused if a service it triggers hasn't finished when the next timer elapses:
|
|
||||||
http://lists.freedesktop.org/archives/systemd-devel/2013-February/009021.html
|
|
||||||
|
|
||||||
Features:
|
Features:
|
||||||
|
|
||||||
* see if we can fix https://bugs.freedesktop.org/show_bug.cgi?id=63672
|
* see if we can fix https://bugs.freedesktop.org/show_bug.cgi?id=63672
|
||||||
|
|
|
@ -251,11 +251,6 @@ static void timer_enter_waiting(Timer *t, bool initial) {
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!initial && v->next_elapse < ts.realtime) {
|
|
||||||
v->disabled = true;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!found_realtime)
|
if (!found_realtime)
|
||||||
t->next_elapse_realtime = v->next_elapse;
|
t->next_elapse_realtime = v->next_elapse;
|
||||||
else
|
else
|
||||||
|
@ -284,18 +279,26 @@ static void timer_enter_waiting(Timer *t, bool initial) {
|
||||||
|
|
||||||
case TIMER_UNIT_ACTIVE:
|
case TIMER_UNIT_ACTIVE:
|
||||||
|
|
||||||
if (UNIT_TRIGGER(UNIT(t))->inactive_exit_timestamp.monotonic <= 0)
|
base = UNIT_TRIGGER(UNIT(t))->inactive_exit_timestamp.monotonic;
|
||||||
|
|
||||||
|
if (base <= 0)
|
||||||
|
base = t->last_trigger_monotonic;
|
||||||
|
|
||||||
|
if (base <= 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
base = UNIT_TRIGGER(UNIT(t))->inactive_exit_timestamp.monotonic;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TIMER_UNIT_INACTIVE:
|
case TIMER_UNIT_INACTIVE:
|
||||||
|
|
||||||
if (UNIT_TRIGGER(UNIT(t))->inactive_enter_timestamp.monotonic <= 0)
|
base = UNIT_TRIGGER(UNIT(t))->inactive_enter_timestamp.monotonic;
|
||||||
|
|
||||||
|
if (base <= 0)
|
||||||
|
base = t->last_trigger_monotonic;
|
||||||
|
|
||||||
|
if (base <= 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
base = UNIT_TRIGGER(UNIT(t))->inactive_enter_timestamp.monotonic;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -304,7 +307,10 @@ static void timer_enter_waiting(Timer *t, bool initial) {
|
||||||
|
|
||||||
v->next_elapse = base + v->value;
|
v->next_elapse = base + v->value;
|
||||||
|
|
||||||
if (!initial && v->next_elapse < ts.monotonic) {
|
if (!initial &&
|
||||||
|
v->next_elapse < ts.monotonic &&
|
||||||
|
(v->base == TIMER_ACTIVE || v->base == TIMER_BOOT || v->base == TIMER_STARTUP)) {
|
||||||
|
/* This is a one time trigger, disable it now */
|
||||||
v->disabled = true;
|
v->disabled = true;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -376,6 +382,8 @@ static void timer_enter_running(Timer *t) {
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
|
t->last_trigger_monotonic = now(CLOCK_MONOTONIC);
|
||||||
|
|
||||||
timer_set_state(t, TIMER_RUNNING);
|
timer_set_state(t, TIMER_RUNNING);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -488,8 +496,6 @@ static void timer_trigger_notify(Unit *u, Unit *other) {
|
||||||
assert(u);
|
assert(u);
|
||||||
assert(other);
|
assert(other);
|
||||||
|
|
||||||
log_error("NOTIFY!");
|
|
||||||
|
|
||||||
if (other->load_state != UNIT_LOADED)
|
if (other->load_state != UNIT_LOADED)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
|
@ -79,6 +79,8 @@ struct Timer {
|
||||||
Watch realtime_watch;
|
Watch realtime_watch;
|
||||||
|
|
||||||
TimerResult result;
|
TimerResult result;
|
||||||
|
|
||||||
|
usec_t last_trigger_monotonic;
|
||||||
};
|
};
|
||||||
|
|
||||||
void timer_free_values(Timer *t);
|
void timer_free_values(Timer *t);
|
||||||
|
|
Loading…
Reference in a new issue