|
1 From 1d0cd85ec6ad9ae9886618816605261e8519b731 Mon Sep 17 00:00:00 2001 |
|
2 From: Alan Coopersmith <[email protected]> |
|
3 Date: Tue, 29 Dec 2015 18:50:08 -0800 |
|
4 Subject: [PATCH 12/19] restart limit |
|
5 |
|
6 Bug 15745160/SUNBT7096672 GDM should stop restarting the Xserver on the console |
|
7 Original owner:yippi date:2011-11-07 type:bug bugster:7096672 |
|
8 --- |
|
9 daemon/gdm-display.c | 33 ++++++++++++++++++++------------- |
|
10 1 file changed, 20 insertions(+), 13 deletions(-) |
|
11 |
|
12 diff --git a/daemon/gdm-display.c b/daemon/gdm-display.c |
|
13 index ab84ba4..ab7eba7 100644 |
|
14 --- a/daemon/gdm-display.c |
|
15 +++ b/daemon/gdm-display.c |
|
16 @@ -68,7 +68,8 @@ struct GdmDisplayPrivate |
|
17 char *x11_display_name; |
|
18 int status; |
|
19 time_t creation_time; |
|
20 - GTimer *server_timer; |
|
21 + int num_failures; |
|
22 + gint64 time_last_start; |
|
23 |
|
24 char *x11_cookie; |
|
25 gsize x11_cookie_size; |
|
26 @@ -613,6 +614,10 @@ gdm_display_manage (GdmDisplay *self) |
|
27 |
|
28 g_debug ("GdmDisplay: Managing display: %s", self->priv->id); |
|
29 |
|
30 + if (self->priv->time_last_start == 0) { |
|
31 + self->priv->time_last_start = g_get_monotonic_time(); |
|
32 + } |
|
33 + |
|
34 /* If not explicitly prepared, do it now */ |
|
35 if (self->priv->status == GDM_DISPLAY_UNMANAGED) { |
|
36 res = gdm_display_prepare (self); |
|
37 @@ -621,8 +626,6 @@ gdm_display_manage (GdmDisplay *self) |
|
38 } |
|
39 } |
|
40 |
|
41 - g_timer_start (self->priv->server_timer); |
|
42 - |
|
43 if (g_strcmp0 (self->priv->session_class, "greeter") == 0) { |
|
44 if (GDM_DISPLAY_GET_CLASS (self)->manage != NULL) { |
|
45 GDM_DISPLAY_GET_CLASS (self)->manage (self); |
|
46 @@ -658,8 +661,6 @@ gdm_display_unmanage (GdmDisplay *self) |
|
47 |
|
48 g_debug ("GdmDisplay: unmanage display"); |
|
49 |
|
50 - g_timer_stop (self->priv->server_timer); |
|
51 - |
|
52 if (self->priv->user_access_file != NULL) { |
|
53 gdm_display_access_file_close (self->priv->user_access_file); |
|
54 g_object_unref (self->priv->user_access_file); |
|
55 @@ -672,9 +673,18 @@ gdm_display_unmanage (GdmDisplay *self) |
|
56 self->priv->access_file = NULL; |
|
57 } |
|
58 |
|
59 - elapsed = g_timer_elapsed (self->priv->server_timer, NULL); |
|
60 - if (elapsed < 3) { |
|
61 - g_warning ("GdmDisplay: display lasted %lf seconds", elapsed); |
|
62 + elapsed = (g_get_monotonic_time() - self->priv->time_last_start) / 1000000; |
|
63 + g_debug ("GdmDisplay: Elapsed time since last start: %lf", elapsed); |
|
64 + if (elapsed > 60) { |
|
65 + self->priv->num_failures = 0; |
|
66 + self->priv->time_last_start = g_get_monotonic_time(); |
|
67 + } else { |
|
68 + self->priv->num_failures++; |
|
69 + g_debug ("GdmDisplay: Number of failures=%d", self->priv->num_failures); |
|
70 + } |
|
71 + |
|
72 + if (self->priv->num_failures >= 5) { |
|
73 + g_warning ("GdmDisplay: Display %s failed 5 times in %lf seconds, no longer managing display", self->priv->id, elapsed); |
|
74 _gdm_display_set_status (self, GDM_DISPLAY_FAILED); |
|
75 } else { |
|
76 _gdm_display_set_status (self, GDM_DISPLAY_UNMANAGED); |
|
77 @@ -1300,7 +1310,8 @@ gdm_display_init (GdmDisplay *self) |
|
78 self->priv = GDM_DISPLAY_GET_PRIVATE (self); |
|
79 |
|
80 self->priv->creation_time = time (NULL); |
|
81 - self->priv->server_timer = g_timer_new (); |
|
82 + self->priv->time_last_start = 0; |
|
83 + self->priv->num_failures = 0; |
|
84 } |
|
85 |
|
86 static void |
|
87 @@ -1336,10 +1347,6 @@ gdm_display_finalize (GObject *object) |
|
88 g_object_unref (self->priv->user_access_file); |
|
89 } |
|
90 |
|
91 - if (self->priv->server_timer != NULL) { |
|
92 - g_timer_destroy (self->priv->server_timer); |
|
93 - } |
|
94 - |
|
95 G_OBJECT_CLASS (gdm_display_parent_class)->finalize (object); |
|
96 } |
|
97 |
|
98 -- |
|
99 2.7.4 |
|
100 |