diff options
author | Lubomir Rintel <lkundrak@v3.sk> | 2018-07-17 20:20:55 +0000 |
---|---|---|
committer | Ray Strode <halfline@gmail.com> | 2018-07-17 20:20:55 +0000 |
commit | feb1cf50ccc9d5e8066aa47d69c53bb39f9dff82 (patch) | |
tree | 78e722c9f1f13ad674cd6045b41c3711d226888a /daemon/gdm-display-factory.c | |
parent | 79a7360ba632d71c7d3b0fd9143419dcc46fb924 (diff) | |
download | gdm-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.c | 41 |
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); } |