chiark / gitweb /
login: set pos-slot to fallback on pos-eviction
authorDavid Herrmann <dh.herrmann@gmail.com>
Tue, 25 Feb 2014 12:08:24 +0000 (13:08 +0100)
committerDavid Herrmann <dh.herrmann@gmail.com>
Tue, 25 Feb 2014 12:10:42 +0000 (13:10 +0100)
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

index 36ec7ed75740004fc430877d73c770fbfaa910c1..96cf08e3b2f1b34fc6d2dc7d0ef2b44a85a94802 100644 (file)
@@ -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) {