From: Michal Sekletar Date: Wed, 20 Apr 2022 08:13:43 +0000 (+0200) Subject: logind: remember our idle state and use it to detect idle level transitions X-Git-Tag: v252-rc1~716^2~1 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=4e2cfb778b9ed7f22ee98f48f28cf8678d25ad32;p=thirdparty%2Fsystemd.git logind: remember our idle state and use it to detect idle level transitions Fixes #16391 --- diff --git a/src/login/logind.c b/src/login/logind.c index aa854805484..d14a17274bb 100644 --- a/src/login/logind.c +++ b/src/login/logind.c @@ -963,18 +963,33 @@ static int manager_dispatch_idle_action(sd_event_source *s, uint64_t t, void *us n = now(CLOCK_MONOTONIC); r = manager_get_idle_hint(m, &since); - if (r <= 0) + if (r <= 0) { /* Not idle. Let's check if after a timeout it might be idle then. */ elapse = n + m->idle_action_usec; - else { + m->was_idle = false; + } else { + /* Idle! Let's see if it's time to do something, or if * we shall sleep for longer. */ if (n >= since.monotonic + m->idle_action_usec && (m->idle_action_not_before_usec <= 0 || n >= m->idle_action_not_before_usec + m->idle_action_usec)) { - log_info("System idle. Will %s now.", handle_action_verb_to_string(m->idle_action)); + bool is_edge = false; + + /* We weren't idle previously or some activity happened while we were sleeping, and now we are + * idle. Let's remember that for the next time and make this an edge transition. */ + if (!m->was_idle || since.monotonic >= m->idle_action_not_before_usec) { + is_edge = true; + m->was_idle = true; + } + + if (m->idle_action == HANDLE_LOCK && !is_edge) + /* We are idle and we were before so we are actually not taking any action. */ + log_debug("System idle."); + else + log_info("System idle. Will %s now.", handle_action_verb_to_string(m->idle_action)); - manager_handle_action(m, 0, m->idle_action, false, false); + manager_handle_action(m, 0, m->idle_action, false, is_edge); m->idle_action_not_before_usec = n; } diff --git a/src/login/logind.h b/src/login/logind.h index 27f9e9729fc..58677c94918 100644 --- a/src/login/logind.h +++ b/src/login/logind.h @@ -94,6 +94,7 @@ struct Manager { usec_t idle_action_usec; usec_t idle_action_not_before_usec; HandleAction idle_action; + bool was_idle; HandleAction handle_power_key; HandleAction handle_power_key_long_press;