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