|
|
787d6d |
From a55bdb007ca24900a704f72359305b04125d9e05 Mon Sep 17 00:00:00 2001
|
|
|
787d6d |
From: Michal Sekletar <msekleta@redhat.com>
|
|
|
787d6d |
Date: Wed, 20 Apr 2022 10:13:43 +0200
|
|
|
787d6d |
Subject: [PATCH] logind: remember our idle state and use it to detect idle
|
|
|
787d6d |
level transitions
|
|
|
787d6d |
|
|
|
787d6d |
Fixes #16391
|
|
|
787d6d |
|
|
|
787d6d |
(cherry picked from commit 4e2cfb778b9ed7f22ee98f48f28cf8678d25ad32)
|
|
|
787d6d |
|
|
|
787d6d |
Resolved: #1866955
|
|
|
787d6d |
---
|
|
|
787d6d |
src/login/logind.c | 23 +++++++++++++++++++----
|
|
|
787d6d |
src/login/logind.h | 1 +
|
|
|
787d6d |
2 files changed, 20 insertions(+), 4 deletions(-)
|
|
|
787d6d |
|
|
|
787d6d |
diff --git a/src/login/logind.c b/src/login/logind.c
|
|
|
787d6d |
index 6b576dad0d..bb1d3f3523 100644
|
|
|
787d6d |
--- a/src/login/logind.c
|
|
|
787d6d |
+++ b/src/login/logind.c
|
|
|
787d6d |
@@ -1027,18 +1027,33 @@ static int manager_dispatch_idle_action(sd_event_source *s, uint64_t t, void *us
|
|
|
787d6d |
n = now(CLOCK_MONOTONIC);
|
|
|
787d6d |
|
|
|
787d6d |
r = manager_get_idle_hint(m, &since);
|
|
|
787d6d |
- if (r <= 0)
|
|
|
787d6d |
+ if (r <= 0) {
|
|
|
787d6d |
/* Not idle. Let's check if after a timeout it might be idle then. */
|
|
|
787d6d |
elapse = n + m->idle_action_usec;
|
|
|
787d6d |
- else {
|
|
|
787d6d |
+ m->was_idle = false;
|
|
|
787d6d |
+ } else {
|
|
|
787d6d |
+
|
|
|
787d6d |
/* Idle! Let's see if it's time to do something, or if
|
|
|
787d6d |
* we shall sleep for longer. */
|
|
|
787d6d |
|
|
|
787d6d |
if (n >= since.monotonic + m->idle_action_usec &&
|
|
|
787d6d |
(m->idle_action_not_before_usec <= 0 || n >= m->idle_action_not_before_usec + m->idle_action_usec)) {
|
|
|
787d6d |
- log_info("System idle. Taking action.");
|
|
|
787d6d |
+ bool is_edge = false;
|
|
|
787d6d |
+
|
|
|
787d6d |
+ /* We weren't idle previously or some activity happened while we were sleeping, and now we are
|
|
|
787d6d |
+ * idle. Let's remember that for the next time and make this an edge transition. */
|
|
|
787d6d |
+ if (!m->was_idle || since.monotonic >= m->idle_action_not_before_usec) {
|
|
|
787d6d |
+ is_edge = true;
|
|
|
787d6d |
+ m->was_idle = true;
|
|
|
787d6d |
+ }
|
|
|
787d6d |
+
|
|
|
787d6d |
+ if (m->idle_action == HANDLE_LOCK && !is_edge)
|
|
|
787d6d |
+ /* We are idle and we were before so we are actually not taking any action. */
|
|
|
787d6d |
+ log_debug("System idle.");
|
|
|
787d6d |
+ else
|
|
|
787d6d |
+ log_info("System idle. Doing %s operation.", handle_action_to_string(m->idle_action));
|
|
|
787d6d |
|
|
|
787d6d |
- manager_handle_action(m, 0, m->idle_action, false, false);
|
|
|
787d6d |
+ manager_handle_action(m, 0, m->idle_action, false, is_edge);
|
|
|
787d6d |
m->idle_action_not_before_usec = n;
|
|
|
787d6d |
}
|
|
|
787d6d |
|
|
|
787d6d |
diff --git a/src/login/logind.h b/src/login/logind.h
|
|
|
787d6d |
index 606adf4fe6..b9b4a5113f 100644
|
|
|
787d6d |
--- a/src/login/logind.h
|
|
|
787d6d |
+++ b/src/login/logind.h
|
|
|
787d6d |
@@ -101,6 +101,7 @@ struct Manager {
|
|
|
787d6d |
usec_t idle_action_usec;
|
|
|
787d6d |
usec_t idle_action_not_before_usec;
|
|
|
787d6d |
HandleAction idle_action;
|
|
|
787d6d |
+ bool was_idle;
|
|
|
787d6d |
|
|
|
787d6d |
usec_t stop_idle_session_usec;
|
|
|
787d6d |
|