forked from pool/systemd
53 lines
1.9 KiB
Diff
53 lines
1.9 KiB
Diff
|
From 3e6b205f81e743c7354ccbc69eb45afbdbebe2dc 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.
|
||
|
---
|
||
|
src/login/logind-seat.c | 14 +++++++++++++-
|
||
|
1 file changed, 13 insertions(+), 1 deletion(-)
|
||
|
|
||
|
diff --git src/login/logind-seat.c src/login/logind-seat.c
|
||
|
index 36ec7ed..96cf08e 100644
|
||
|
--- src/login/logind-seat.c
|
||
|
+++ 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) {
|
||
|
--
|
||
|
1.7.9.2
|
||
|
|