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: archive/raspbian/251.6-1+rpi1^2~20 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=123bc29b21d35f9bcc6ca7dd2fb4d437ced3b519;p=systemd.git logind: remember our idle state and use it to detect idle level transitions Fixes #16391 (cherry picked from commit 4e2cfb778b9ed7f22ee98f48f28cf8678d25ad32) Gbp-Pq: Name logind-remember-our-idle-state-and-use-it-to-detect-idle-.patch --- diff --git a/src/login/logind.c b/src/login/logind.c index aa854805..d14a1727 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 27f9e972..58677c94 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;