[gnome-session: 1/2] manager: continue if a client exits during EndSession signal



commit feafe51da70105039bf91317307610f1ba90b830
Author: Alexandr Miloslavskiy <alexandr miloslavskiy syntevo com>
Date:   Wed May 8 15:13:22 2019 +0200

    manager: continue if a client exits during EndSession signal

 gnome-session/gsm-manager.c | 29 ++++++++++++++++++++++++++++-
 1 file changed, 28 insertions(+), 1 deletion(-)
---
diff --git a/gnome-session/gsm-manager.c b/gnome-session/gsm-manager.c
index e50ba33c..d41bdcac 100644
--- a/gnome-session/gsm-manager.c
+++ b/gnome-session/gsm-manager.c
@@ -1645,7 +1645,8 @@ _disconnect_client (GsmManager *manager,
                 }
         }
 
-        if (manager->priv->phase == GSM_MANAGER_PHASE_QUERY_END_SESSION) {
+        switch (manager->priv->phase) {
+        case GSM_MANAGER_PHASE_QUERY_END_SESSION:
                 /* Instead of answering our end session query, the client just exited.
                  * Treat that as an "okay, end the session" answer.
                  *
@@ -1661,6 +1662,32 @@ _disconnect_client (GsmManager *manager,
                                                      "query end session phase "
                                                      "instead of end session "
                                                      "phase");
+                break;
+        case GSM_MANAGER_PHASE_END_SESSION:
+                if (! g_slist_find (manager->priv->query_clients, client)) {
+                        /* the client sent its EndSessionResponse and we already
+                         * processed it.
+                         */
+                        break;
+                }
+
+                /* Client exited without sending EndSessionResponse.
+                 * The likely reason is that its exit code is written in a way
+                 * that never returns, and sending EndSessionResponse is handled
+                 * in library code after the callback. Or maybe the application
+                 * crashed while handling EndSession. Or it was lazy.
+                 */
+                _handle_client_end_session_response (manager,
+                                                     client,
+                                                     TRUE,
+                                                     FALSE,
+                                                     FALSE,
+                                                     "Client exited in "
+                                                     "end session phase without "
+                                                     "sending EndSessionResponse");
+        default:
+                /* do nothing */
+                break;
         }
 
         if (manager->priv->dbus_disconnected && GSM_IS_DBUS_CLIENT (client)) {


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]