summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Cameron <brian.cameron@oracle.com>2012-06-21 20:21:25 -0500
committerBrian Cameron <brian.cameron@oracle.com>2012-06-21 20:21:25 -0500
commit1e9bdbebde295df918d5b2270de4398db0f21ea4 (patch)
tree43f1854f60c704fdf7509358186d80b9058e84b7
parentc3a0767cadc442c04cc253760ee304b681a4b1de (diff)
downloadgdm-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.c33
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);
}