From: Lennart Poettering Date: Tue, 23 Apr 2013 20:42:31 +0000 (-0300) Subject: timer: make sure we restart timers even if units are still running or if one of their... X-Git-Tag: v203~105 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=e41e194340f9a8dbd982b5030449281c3c8bf0dd timer: make sure we restart timers even if units are still running or if one of their conditions fails --- diff --git a/TODO b/TODO index de950d7a8..fe27d2b2a 100644 --- a/TODO +++ b/TODO @@ -24,12 +24,6 @@ Fedora 19: * localed: - 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: * see if we can fix https://bugs.freedesktop.org/show_bug.cgi?id=63672 diff --git a/src/core/timer.c b/src/core/timer.c index b5d895f04..b8039d82e 100644 --- a/src/core/timer.c +++ b/src/core/timer.c @@ -251,11 +251,6 @@ static void timer_enter_waiting(Timer *t, bool initial) { if (r < 0) continue; - if (!initial && v->next_elapse < ts.realtime) { - v->disabled = true; - continue; - } - if (!found_realtime) t->next_elapse_realtime = v->next_elapse; else @@ -284,18 +279,26 @@ static void timer_enter_waiting(Timer *t, bool initial) { 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; - base = UNIT_TRIGGER(UNIT(t))->inactive_exit_timestamp.monotonic; break; 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; - base = UNIT_TRIGGER(UNIT(t))->inactive_enter_timestamp.monotonic; break; default: @@ -304,7 +307,10 @@ static void timer_enter_waiting(Timer *t, bool initial) { 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; continue; } @@ -376,6 +382,8 @@ static void timer_enter_running(Timer *t) { if (r < 0) goto fail; + t->last_trigger_monotonic = now(CLOCK_MONOTONIC); + timer_set_state(t, TIMER_RUNNING); return; @@ -488,8 +496,6 @@ static void timer_trigger_notify(Unit *u, Unit *other) { assert(u); assert(other); - log_error("NOTIFY!"); - if (other->load_state != UNIT_LOADED) return; diff --git a/src/core/timer.h b/src/core/timer.h index 163bd6c3b..fed15e916 100644 --- a/src/core/timer.h +++ b/src/core/timer.h @@ -79,6 +79,8 @@ struct Timer { Watch realtime_watch; TimerResult result; + + usec_t last_trigger_monotonic; }; void timer_free_values(Timer *t);