[systemd-commits] src/login

David Herrmann dvdhrm at kemper.freedesktop.org
Tue Feb 25 04:11:01 PST 2014


 src/login/logind-seat.c |   14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

New commits:
commit 3e6b205f81e743c7354ccbc69eb45afbdbebe2dc
Author: David Herrmann <dh.herrmann at gmail.com>
Date:   Tue Feb 25 13:08:24 2014 +0100

    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.

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) {



More information about the systemd-commits mailing list