diff options
author | Brian Cameron <brian.cameron@oracle.com> | 2012-06-21 20:21:25 -0500 |
---|---|---|
committer | Brian Cameron <brian.cameron@oracle.com> | 2012-06-21 20:21:25 -0500 |
commit | 1e9bdbebde295df918d5b2270de4398db0f21ea4 (patch) | |
tree | 43f1854f60c704fdf7509358186d80b9058e84b7 | |
parent | c3a0767cadc442c04cc253760ee304b681a4b1de (diff) | |
download | gdm-1e9bdbebde295df918d5b2270de4398db0f21ea4.tar.gz |
Add patch to make GDM stop trying to manage a display if it fails 5 times in
a row.
-rw-r--r-- | daemon/gdm-display.c | 33 |
1 files changed, 20 insertions, 13 deletions
diff --git a/daemon/gdm-display.c b/daemon/gdm-display.c index 047d23e8..60e85a79 100644 --- a/daemon/gdm-display.c +++ b/daemon/gdm-display.c @@ -62,7 +62,8 @@ struct GdmDisplayPrivate char *x11_display_type; int status; time_t creation_time; - GTimer *slave_timer; + int num_failures; + gint64 time_last_start; char *slave_command; char *x11_cookie; @@ -654,8 +655,6 @@ gdm_display_real_manage (GdmDisplay *display) g_assert (display->priv->slave_proxy != NULL); - g_timer_start (display->priv->slave_timer); - gdm_slave_proxy_start (display->priv->slave_proxy); return TRUE; @@ -670,6 +669,10 @@ gdm_display_manage (GdmDisplay *display) g_debug ("GdmDisplay: Managing display: %s", display->priv->id); + if (display->priv->time_last_start == 0) { + display->priv->time_last_start = g_get_monotonic_time(); + } + g_object_ref (display); ret = GDM_DISPLAY_GET_CLASS (display)->manage (display); g_object_unref (display); @@ -714,8 +717,6 @@ gdm_display_real_unmanage (GdmDisplay *display) g_debug ("GdmDisplay: unmanage display"); - g_timer_stop (display->priv->slave_timer); - if (display->priv->slave_proxy != NULL) { gdm_slave_proxy_stop (display->priv->slave_proxy); @@ -735,9 +736,18 @@ gdm_display_real_unmanage (GdmDisplay *display) display->priv->access_file = NULL; } - elapsed = g_timer_elapsed (display->priv->slave_timer, NULL); - if (elapsed < 3) { - g_warning ("GdmDisplay: display lasted %lf seconds", elapsed); + elapsed = (g_get_monotonic_time() - display->priv->time_last_start) / 1000000; + g_debug ("GdmDisplay: Elapsed time since last start: %lf", elapsed); + if (elapsed > 60) { + display->priv->num_failures = 0; + display->priv->time_last_start = g_get_monotonic_time(); + } else { + display->priv->num_failures++; + g_debug ("GdmDisplay: Number of failures=%d", display->priv->num_failures); + } + + if (display->priv->num_failures >= 5) { + g_warning ("GdmDisplay: Display %s failed 5 times in %lf seconds, no longer managing display", display->priv->id, elapsed); _gdm_display_set_status (display, GDM_DISPLAY_FAILED); } else { _gdm_display_set_status (display, GDM_DISPLAY_UNMANAGED); @@ -1302,7 +1312,8 @@ gdm_display_init (GdmDisplay *display) display->priv = GDM_DISPLAY_GET_PRIVATE (display); display->priv->creation_time = time (NULL); - display->priv->slave_timer = g_timer_new (); + display->priv->time_last_start = 0; + display->priv->num_failures = 0; } static void @@ -1336,10 +1347,6 @@ gdm_display_finalize (GObject *object) g_object_unref (display->priv->user_access_file); } - if (display->priv->slave_timer != NULL) { - g_timer_destroy (display->priv->slave_timer); - } - G_OBJECT_CLASS (gdm_display_parent_class)->finalize (object); } |