X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fcore%2Ftimer.c;h=b8039d82ec3549bf98ff11a96f5f3daa752e4c5b;hb=a6b26d9011de60e1c41f51e8d2aab1d2f7bbf0f5;hp=b5d895f048ca99596eeeb50c5ac6d2f2119a7b24;hpb=3ecaa09bccd8a59c9f1e06756a1334a162206dc4;p=elogind.git 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;