chiark / gitweb /
logind: If all user sessions are in closing state, set the overall status to closing.
authorColin Guthrie <colin@mageia.org>
Mon, 3 Sep 2012 22:47:01 +0000 (23:47 +0100)
committerLennart Poettering <lennart@poettering.net>
Wed, 12 Sep 2012 06:19:40 +0000 (08:19 +0200)
PulseAudio for example will keep a client connection open provided
at least one session exists. However, if all sessions are currently
in the process of closing, we should flag that as the overall state
appropriately to better reflect what is happening.

Although this does better reflect the status for any given user, it does
not actually solve the overall problem of PulseAudio still finding some
sessions active and thus not exiting and therefore actually preventing
the session from closing. Future commits will extend sd-login to cope
with this situation.

src/login/logind-user.c

index aa9c3f1a319abe4cd79e96a66b444d1984d51a1b..a33978c188cc33d3bfe4019fcb1542041355240f 100644 (file)
@@ -568,15 +568,20 @@ void user_add_to_gc_queue(User *u) {
 
 UserState user_get_state(User *u) {
         Session *i;
+        bool all_closing = true;
 
         assert(u);
 
-        LIST_FOREACH(sessions_by_user, i, u->sessions)
+
+        LIST_FOREACH(sessions_by_user, i, u->sessions) {
                 if (session_is_active(i))
                         return USER_ACTIVE;
+                if (session_get_state(i) != SESSION_CLOSING)
+                        all_closing = false;
+        }
 
         if (u->sessions)
-                return USER_ONLINE;
+                return all_closing ? USER_CLOSING : USER_ONLINE;
 
         if (user_check_linger_file(u) > 0)
                 return USER_LINGERING;