Zbigniew Jędrzejewski-Szmek 47c564
From aa6c8bcd17b37634fc7e4d5d59b6b9d93625b4a3 Mon Sep 17 00:00:00 2001
Zbigniew Jędrzejewski-Szmek 47c564
From: David Herrmann <dh.herrmann@gmail.com>
Zbigniew Jędrzejewski-Szmek 47c564
Date: Tue, 25 Feb 2014 13:08:24 +0100
Zbigniew Jędrzejewski-Szmek 47c564
Subject: [PATCH] login: set pos-slot to fallback on pos-eviction
Zbigniew Jędrzejewski-Szmek 47c564
Zbigniew Jędrzejewski-Szmek 47c564
If we evict a session position, we open the position slot for future
Zbigniew Jędrzejewski-Szmek 47c564
sessions. However, there might already be another session on the same
Zbigniew Jędrzejewski-Szmek 47c564
position if both were started on the same VT. This is currently done if
Zbigniew Jędrzejewski-Szmek 47c564
gdm spawns the session on its own Xserver.
Zbigniew Jędrzejewski-Szmek 47c564
Zbigniew Jędrzejewski-Szmek 47c564
Hence, look for such a session on pos-eviction and claim the new slot
Zbigniew Jędrzejewski-Szmek 47c564
immediately.
Zbigniew Jędrzejewski-Szmek 47c564
Zbigniew Jędrzejewski-Szmek 47c564
(cherry picked from commit 3e6b205f81e743c7354ccbc69eb45afbdbebe2dc)
Zbigniew Jędrzejewski-Szmek 47c564
---
Zbigniew Jędrzejewski-Szmek 47c564
 src/login/logind-seat.c | 14 +++++++++++++-
Zbigniew Jędrzejewski-Szmek 47c564
 1 file changed, 13 insertions(+), 1 deletion(-)
Zbigniew Jędrzejewski-Szmek 47c564
Zbigniew Jędrzejewski-Szmek 47c564
diff --git a/src/login/logind-seat.c b/src/login/logind-seat.c
Zbigniew Jędrzejewski-Szmek 47c564
index 36ec7ed..96cf08e 100644
Zbigniew Jędrzejewski-Szmek 47c564
--- a/src/login/logind-seat.c
Zbigniew Jędrzejewski-Szmek 47c564
+++ b/src/login/logind-seat.c
Zbigniew Jędrzejewski-Szmek 47c564
@@ -459,6 +459,7 @@ int seat_stop_sessions(Seat *s, bool force) {
Zbigniew Jędrzejewski-Szmek 47c564
 }
Zbigniew Jędrzejewski-Szmek 47c564
 
Zbigniew Jędrzejewski-Szmek 47c564
 void seat_evict_position(Seat *s, Session *session) {
Zbigniew Jędrzejewski-Szmek 47c564
+        Session *iter;
Zbigniew Jędrzejewski-Szmek 47c564
         unsigned int pos = session->pos;
Zbigniew Jędrzejewski-Szmek 47c564
 
Zbigniew Jędrzejewski-Szmek 47c564
         session->pos = 0;
Zbigniew Jędrzejewski-Szmek 47c564
@@ -466,8 +467,19 @@ void seat_evict_position(Seat *s, Session *session) {
Zbigniew Jędrzejewski-Szmek 47c564
         if (!pos)
Zbigniew Jędrzejewski-Szmek 47c564
                 return;
Zbigniew Jędrzejewski-Szmek 47c564
 
Zbigniew Jędrzejewski-Szmek 47c564
-        if (pos < s->position_count && s->positions[pos] == session)
Zbigniew Jędrzejewski-Szmek 47c564
+        if (pos < s->position_count && s->positions[pos] == session) {
Zbigniew Jędrzejewski-Szmek 47c564
                 s->positions[pos] = NULL;
Zbigniew Jędrzejewski-Szmek 47c564
+
Zbigniew Jędrzejewski-Szmek 47c564
+                /* There might be another session claiming the same
Zbigniew Jędrzejewski-Szmek 47c564
+                 * position (eg., during gdm->session transition), so lets look
Zbigniew Jędrzejewski-Szmek 47c564
+                 * for it and set it on the free slot. */
Zbigniew Jędrzejewski-Szmek 47c564
+                LIST_FOREACH(sessions_by_seat, iter, s->sessions) {
Zbigniew Jędrzejewski-Szmek 47c564
+                        if (iter->pos == pos) {
Zbigniew Jędrzejewski-Szmek 47c564
+                                s->positions[pos] = iter;
Zbigniew Jędrzejewski-Szmek 47c564
+                                break;
Zbigniew Jędrzejewski-Szmek 47c564
+                        }
Zbigniew Jędrzejewski-Szmek 47c564
+                }
Zbigniew Jędrzejewski-Szmek 47c564
+        }
Zbigniew Jędrzejewski-Szmek 47c564
 }
Zbigniew Jędrzejewski-Szmek 47c564
 
Zbigniew Jędrzejewski-Szmek 47c564
 void seat_claim_position(Seat *s, Session *session, unsigned int pos) {