summaryrefslogtreecommitdiff
path: root/core/systemd/0002-login-set-pos-slot-to-fallback-on-pos-eviction.patch
diff options
context:
space:
mode:
Diffstat (limited to 'core/systemd/0002-login-set-pos-slot-to-fallback-on-pos-eviction.patch')
-rw-r--r--core/systemd/0002-login-set-pos-slot-to-fallback-on-pos-eviction.patch52
1 files changed, 52 insertions, 0 deletions
diff --git a/core/systemd/0002-login-set-pos-slot-to-fallback-on-pos-eviction.patch b/core/systemd/0002-login-set-pos-slot-to-fallback-on-pos-eviction.patch
new file mode 100644
index 000000000..f499ed2c0
--- /dev/null
+++ b/core/systemd/0002-login-set-pos-slot-to-fallback-on-pos-eviction.patch
@@ -0,0 +1,52 @@
+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 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) {
+--
+1.9.0
+