components/gnome/gdm/patches/0012-restart-limit.patch
changeset 7201 bcc18175756d
equal deleted inserted replaced
7200:bc003d56ef5a 7201:bcc18175756d
       
     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