[gnome-online-accounts/gnome-3-8] alarm: Use the same GSource pointer for TIMER and TIMEOUT alarms



commit 8d0d36ecd67f4e020965efb74373db4644008bef
Author: Debarshi Ray <debarshir gnome org>
Date:   Mon Nov 11 11:51:42 2013 +0100

    alarm: Use the same GSource pointer for TIMER and TIMEOUT alarms
    
    Simplifies the code so that it is easier to tag the "cancelled"
    handler with the correct GSource and GInputStream (if any) that are to
    be cleaned.
    
    Fixes: https://bugzilla.gnome.org/711696

 src/goaidentity/goaalarm.c |   50 +++++++++++++++-----------------------------
 1 files changed, 17 insertions(+), 33 deletions(-)
---
diff --git a/src/goaidentity/goaalarm.c b/src/goaidentity/goaalarm.c
index e51df73..eccfa09 100644
--- a/src/goaidentity/goaalarm.c
+++ b/src/goaidentity/goaalarm.c
@@ -1,6 +1,6 @@
 /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
 /*
- * Copyright (C) 2012 Red Hat, Inc.
+ * Copyright (C) 2012, 2013 Red Hat, Inc.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -39,17 +39,6 @@
 
 #include "goalogging.h"
 
-typedef struct
-{
-  GSource *source;
-  GInputStream *stream;
-} Timer;
-
-typedef struct
-{
-  GSource *source;
-} Timeout;
-
 #define MAX_TIMEOUT_INTERVAL (10 *1000)
 
 typedef enum
@@ -70,11 +59,8 @@ struct _GoaAlarmPrivate
   GRecMutex lock;
 
   GoaAlarmType type;
-  union
-  {
-    Timer timer;
-    Timeout timeout;
-  };
+  GSource *scheduled_wakeup_source;
+  GInputStream *stream; /* NULL, unless using timerfd */
 };
 
 enum
@@ -110,10 +96,10 @@ clear_scheduled_timer_wakeups (GoaAlarm *self)
   GError *error;
   gboolean is_closed;
 
-  g_clear_pointer (&self->priv->timer.source, (GDestroyNotify) g_source_destroy);
+  g_clear_pointer (&self->priv->scheduled_wakeup_source, (GDestroyNotify) g_source_destroy);
 
   error = NULL;
-  is_closed = g_input_stream_close (self->priv->timer.stream, NULL, &error);
+  is_closed = g_input_stream_close (self->priv->stream, NULL, &error);
 
   if (!is_closed)
     {
@@ -121,14 +107,14 @@ clear_scheduled_timer_wakeups (GoaAlarm *self)
       g_error_free (error);
     }
 
-  g_clear_object (&self->priv->timer.stream);
+  g_clear_object (&self->priv->stream);
 #endif
 }
 
 static void
 clear_scheduled_timeout_wakeups (GoaAlarm *self)
 {
-  g_clear_pointer (&self->priv->timeout.source, (GDestroyNotify) g_source_destroy);
+  g_clear_pointer (&self->priv->scheduled_wakeup_source, (GDestroyNotify) g_source_destroy);
 }
 
 static void
@@ -154,8 +140,6 @@ clear_scheduled_wakeups (GoaAlarm *self)
   g_clear_pointer (&self->priv->previous_wakeup_time,
                    (GDestroyNotify) g_date_time_unref);
 
-  g_assert (self->priv->timeout.source == NULL);
-
   self->priv->type = GOA_ALARM_TYPE_UNSCHEDULED;
   g_rec_mutex_unlock (&self->priv->lock);
 }
@@ -435,7 +419,7 @@ clear_timer_source (GTask *task)
   GoaAlarm *self;
 
   self = g_task_get_source_object (task);
-  self->priv->timer.source = NULL;
+  self->priv->scheduled_wakeup_source = NULL;
 
   g_object_unref (task);
 }
@@ -480,19 +464,19 @@ schedule_wakeups_with_timerfd (GoaAlarm *self)
     }
 
   self->priv->type = GOA_ALARM_TYPE_TIMER;
-  self->priv->timer.stream = g_unix_input_stream_new (fd, TRUE);
+  self->priv->stream = g_unix_input_stream_new (fd, TRUE);
 
   task = g_task_new (self, self->priv->cancellable, NULL, NULL);
 
   source =
     g_pollable_input_stream_create_source (G_POLLABLE_INPUT_STREAM
-                                           (self->priv->timer.stream),
+                                           (self->priv->stream),
                                            self->priv->cancellable);
-  self->priv->timer.source = source;
-  g_source_set_callback (self->priv->timer.source,
+  self->priv->scheduled_wakeup_source = source;
+  g_source_set_callback (self->priv->scheduled_wakeup_source,
                          (GSourceFunc) on_timer_source_ready, task,
                          (GDestroyNotify) clear_timer_source);
-  g_source_attach (self->priv->timer.source, self->priv->context);
+  g_source_attach (self->priv->scheduled_wakeup_source, self->priv->context);
   g_source_unref (source);
 
   return TRUE;
@@ -528,7 +512,7 @@ out:
 static void
 clear_timeout_source_pointer (GoaAlarm *self)
 {
-  self->priv->timeout.source = NULL;
+  self->priv->scheduled_wakeup_source = NULL;
 }
 
 static void
@@ -556,13 +540,13 @@ schedule_wakeups_with_timeout_source (GoaAlarm *self)
 
   source = g_timeout_source_new (interval);
 
-  self->priv->timeout.source = source;
-  g_source_set_callback (self->priv->timeout.source,
+  self->priv->scheduled_wakeup_source = source;
+  g_source_set_callback (self->priv->scheduled_wakeup_source,
                          (GSourceFunc)
                          on_timeout_source_ready,
                          self, (GDestroyNotify) clear_timeout_source_pointer);
 
-  g_source_attach (self->priv->timeout.source, self->priv->context);
+  g_source_attach (self->priv->scheduled_wakeup_source, self->priv->context);
   g_source_unref (source);
 }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]