]> rtime.felk.cvut.cz Git - sojka/lightdm.git/commitdiff
Don't attempt generate D-Bus seat/session removal signals on shutdown.
authorRobert Ancell <robert.ancell@canonical.com>
Sun, 7 Dec 2014 22:37:28 +0000 (11:37 +1300)
committerRobert Ancell <robert.ancell@canonical.com>
Sun, 7 Dec 2014 22:37:28 +0000 (11:37 +1300)
This crashes on more recent versions of GLib.

src/lightdm.c
tests/scripts/dbus.conf

index 886eae81297dea5f563d2381cdb275c9db13258f..fdebd682f5a34736a6f8e20ce55fd0a6cd272db4 100644 (file)
@@ -611,11 +611,6 @@ seat_bus_entry_free (gpointer data)
 {
     SeatBusEntry *entry = data;
 
-    g_dbus_connection_unregister_object (bus, entry->bus_id);
-
-    emit_object_value_changed (bus, "/org/freedesktop/DisplayManager", "org.freedesktop.DisplayManager", "Seats", get_seat_list ());
-    emit_object_signal (bus, "/org/freedesktop/DisplayManager", "SeatRemoved", entry->path);
-
     g_free (entry->path);
     g_free (entry);
 }
@@ -625,14 +620,6 @@ session_bus_entry_free (gpointer data)
 {
     SessionBusEntry *entry = data;
 
-    g_dbus_connection_unregister_object (bus, entry->bus_id);
-
-    emit_object_value_changed (bus, "/org/freedesktop/DisplayManager", "org.freedesktop.DisplayManager", "Sessions", get_session_list (NULL));
-    emit_object_signal (bus, "/org/freedesktop/DisplayManager", "SessionRemoved", entry->path);
-
-    emit_object_value_changed (bus, entry->seat_path, "org.freedesktop.DisplayManager.Seat", "Sessions", get_session_list (entry->seat_path));
-    emit_object_signal (bus, entry->seat_path, "SessionRemoved", entry->path);
-
     g_free (entry->path);
     g_free (entry->seat_path);
     g_free (entry);
@@ -685,8 +672,28 @@ running_user_session_cb (Seat *seat, Session *session)
 static void
 session_removed_cb (Seat *seat, Session *session)
 {
+    SessionBusEntry *entry;
+    gchar *seat_path = NULL;
+
     g_signal_handlers_disconnect_matched (session, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, seat);
+
+    entry = g_hash_table_lookup (session_bus_entries, session);
+    if (entry)
+    {
+        g_dbus_connection_unregister_object (bus, entry->bus_id);
+        emit_object_signal (bus, "/org/freedesktop/DisplayManager", "SessionRemoved", entry->path);
+        emit_object_signal (bus, entry->seat_path, "SessionRemoved", entry->path);
+        seat_path = g_strdup (entry->seat_path);
+    }
+
     g_hash_table_remove (session_bus_entries, session);
+
+    if (seat_path)
+    {
+        emit_object_value_changed (bus, "/org/freedesktop/DisplayManager", "org.freedesktop.DisplayManager", "Sessions", get_session_list (NULL));
+        emit_object_value_changed (bus, seat_path, "org.freedesktop.DisplayManager.Seat", "Sessions", get_session_list (seat_path));
+        g_free (seat_path);
+    }
 }
 
 static void
@@ -730,7 +737,18 @@ seat_added_cb (DisplayManager *display_manager, Seat *seat)
 static void
 seat_removed_cb (DisplayManager *display_manager, Seat *seat)
 {
+    SeatBusEntry *entry;
+
+    entry = g_hash_table_lookup (seat_bus_entries, seat);
+    if (entry)
+    {
+        g_dbus_connection_unregister_object (bus, entry->bus_id);
+        emit_object_signal (bus, "/org/freedesktop/DisplayManager", "SeatRemoved", entry->path);
+    }
+
     g_hash_table_remove (seat_bus_entries, seat);
+  
+    emit_object_value_changed (bus, "/org/freedesktop/DisplayManager", "org.freedesktop.DisplayManager", "Seats", get_seat_list ());
 }
 
 static gboolean
index 5f2ce05b62ef85d0dc8f0b5e44a549335dd0f810..e38c9c092faa5434d66d25cb627372d6d6164ec9 100644 (file)
@@ -64,10 +64,10 @@ user-session=default
 #?XSERVER-0 TERMINATE SIGNAL=15
 
 # Removal is reported via D-Bus
-#?RUNNER DBUS-PROPERTIES-CHANGED PATH=/org/freedesktop/DisplayManager INTERFACE=org.freedesktop.DisplayManager CHANGED=Sessions
 #?RUNNER DBUS-SIGNAL PATH=/org/freedesktop/DisplayManager INTERFACE=org.freedesktop.DisplayManager NAME=SessionRemoved
-#?RUNNER DBUS-PROPERTIES-CHANGED PATH=/org/freedesktop/DisplayManager/Seat0 INTERFACE=org.freedesktop.DisplayManager.Seat CHANGED=Sessions
 #?RUNNER DBUS-SIGNAL PATH=/org/freedesktop/DisplayManager/Seat0 INTERFACE=org.freedesktop.DisplayManager NAME=SessionRemoved
+#?RUNNER DBUS-PROPERTIES-CHANGED PATH=/org/freedesktop/DisplayManager INTERFACE=org.freedesktop.DisplayManager CHANGED=Sessions
+#?RUNNER DBUS-PROPERTIES-CHANGED PATH=/org/freedesktop/DisplayManager/Seat0 INTERFACE=org.freedesktop.DisplayManager.Seat CHANGED=Sessions
 
 # X server starts
 #?XSERVER-0 START VT=7 SEAT=seat0