summaryrefslogtreecommitdiff
path: root/daemon/gdm-display-factory.c
diff options
context:
space:
mode:
authorLubomir Rintel <lkundrak@v3.sk>2018-07-17 20:20:55 +0000
committerRay Strode <halfline@gmail.com>2018-07-17 20:20:55 +0000
commitfeb1cf50ccc9d5e8066aa47d69c53bb39f9dff82 (patch)
tree78e722c9f1f13ad674cd6045b41c3711d226888a /daemon/gdm-display-factory.c
parent79a7360ba632d71c7d3b0fd9143419dcc46fb924 (diff)
downloadgdm-feb1cf50ccc9d5e8066aa47d69c53bb39f9dff82.tar.gz
display-factory: avoid removing a display from store while iterating it
Diffstat (limited to 'daemon/gdm-display-factory.c')
-rw-r--r--daemon/gdm-display-factory.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/daemon/gdm-display-factory.c b/daemon/gdm-display-factory.c
index d86a4c8a..c520e108 100644
--- a/daemon/gdm-display-factory.c
+++ b/daemon/gdm-display-factory.c
@@ -35,6 +35,7 @@
struct GdmDisplayFactoryPrivate
{
GdmDisplayStore *display_store;
+ guint purge_displays_id;
};
enum {
@@ -59,6 +60,41 @@ gdm_display_factory_error_quark (void)
return ret;
}
+static gboolean
+purge_display (char *id,
+ GdmDisplay *display,
+ gpointer user_data)
+{
+ int status;
+
+ status = gdm_display_get_status (display);
+
+ switch (status) {
+ case GDM_DISPLAY_FINISHED:
+ case GDM_DISPLAY_FAILED:
+ return TRUE;
+ default:
+ return FALSE;
+ }
+}
+
+static void
+purge_displays (GdmDisplayFactory *factory)
+{
+ factory->priv->purge_displays_id = 0;
+ gdm_display_store_foreach_remove (factory->priv->display_store,
+ (GdmDisplayStoreFunc)purge_display,
+ NULL);
+}
+
+void
+gdm_display_factory_queue_purge_displays (GdmDisplayFactory *factory)
+{
+ if (factory->priv->purge_displays_id == 0) {
+ factory->priv->purge_displays_id = g_idle_add ((GSourceFunc) purge_displays, factory);
+ }
+}
+
GdmDisplayStore *
gdm_display_factory_get_display_store (GdmDisplayFactory *factory)
{
@@ -187,5 +223,10 @@ gdm_display_factory_finalize (GObject *object)
g_return_if_fail (factory->priv != NULL);
+ if (factory->priv->purge_displays_id != 0) {
+ g_source_remove (factory->priv->purge_displays_id);
+ factory->priv->purge_displays_id = 0;
+ }
+
G_OBJECT_CLASS (gdm_display_factory_parent_class)->finalize (object);
}