[gnome-calendar] views: Instrument and fix reference leaks



commit 194407ecfba972519de336178faca47855751128
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date:   Sun Jan 28 12:08:04 2018 -0200

    views: Instrument and fix reference leaks

 src/gcal-event.c             |  2 ++
 src/views/gcal-month-view.c  | 22 +++++++++++++++-------
 src/views/gcal-week-grid.c   |  3 +++
 src/views/gcal-week-header.c |  5 ++++-
 src/views/gcal-week-view.c   |  3 +--
 src/views/gcal-year-view.c   | 30 +++++++++++++++++++++++-------
 6 files changed, 48 insertions(+), 17 deletions(-)
---
diff --git a/src/gcal-event.c b/src/gcal-event.c
index 2d66abf1..b9e31935 100644
--- a/src/gcal-event.c
+++ b/src/gcal-event.c
@@ -157,6 +157,8 @@ destroy_event_cache_map (void)
 {
   GList *events;
 
+  g_debug ("Number of cached events at destruction: %d", g_hash_table_size (event_cache));
+
   /* Destroy all events */
   events = g_hash_table_get_values (event_cache);
   g_list_free_full (events, g_object_unref);
diff --git a/src/views/gcal-month-view.c b/src/views/gcal-month-view.c
index 265a6895..5c28cb09 100644
--- a/src/views/gcal-month-view.c
+++ b/src/views/gcal-month-view.c
@@ -1357,11 +1357,13 @@ gcal_month_view_component_added (ECalDataModelSubscriber *subscriber,
                                  ECalClient              *client,
                                  ECalComponent           *comp)
 {
+  g_autoptr (GcalEvent) event = NULL;
   GcalMonthView *self;
   GtkWidget *event_widget;
-  GcalEvent *event;
   GError *error;
 
+  GCAL_ENTRY;
+
   error = NULL;
   self = GCAL_MONTH_VIEW (subscriber);
   event = gcal_event_new (e_client_get_source (E_CLIENT (client)), comp, &error);
@@ -1370,7 +1372,7 @@ gcal_month_view_component_added (ECalDataModelSubscriber *subscriber,
     {
       g_warning ("Error creating event: %s", error->message);
       g_clear_error (&error);
-      return;
+      GCAL_RETURN ();
     }
 
   event_widget = gcal_event_widget_new (event);
@@ -1381,7 +1383,7 @@ gcal_month_view_component_added (ECalDataModelSubscriber *subscriber,
 
   self->pending_event_allocation = TRUE;
 
-  g_clear_object (&event);
+  GCAL_EXIT;
 }
 
 static void
@@ -1389,12 +1391,14 @@ gcal_month_view_component_modified (ECalDataModelSubscriber *subscriber,
                                     ECalClient              *client,
                                     ECalComponent           *comp)
 {
+  g_autoptr (GcalEvent) event = NULL;
   GcalMonthView *self;
   GtkWidget *new_widget;
-  GcalEvent *event;
   GError *error;
   GList *l;
 
+  GCAL_ENTRY;
+
   error = NULL;
   self = GCAL_MONTH_VIEW (subscriber);
   event = gcal_event_new (e_client_get_source (E_CLIENT (client)), comp, &error);
@@ -1403,7 +1407,7 @@ gcal_month_view_component_modified (ECalDataModelSubscriber *subscriber,
     {
       g_warning ("Error creating event: %s", error->message);
       g_clear_error (&error);
-      return;
+      GCAL_RETURN ();
     }
 
   new_widget = gcal_event_widget_new (event);
@@ -1427,7 +1431,7 @@ gcal_month_view_component_modified (ECalDataModelSubscriber *subscriber,
 
   self->pending_event_allocation = TRUE;
 
-  g_clear_object (&event);
+  GCAL_EXIT;
 }
 
 static void
@@ -1441,6 +1445,8 @@ gcal_month_view_component_removed (ECalDataModelSubscriber *subscriber,
   const gchar *sid;
   GList *l;
 
+  GCAL_ENTRY;
+
   self = GCAL_MONTH_VIEW (subscriber);
   sid = e_source_get_uid (e_client_get_source (E_CLIENT (client)));
 
@@ -1457,12 +1463,14 @@ gcal_month_view_component_removed (ECalDataModelSubscriber *subscriber,
                  G_STRFUNC,
                  uuid,
                  gtk_widget_get_name (GTK_WIDGET (subscriber)));
-      return;
+      GCAL_RETURN ();
     }
 
   gtk_widget_destroy (l->data);
 
   self->pending_event_allocation = TRUE;
+
+  GCAL_EXIT;
 }
 
 static void
diff --git a/src/views/gcal-week-grid.c b/src/views/gcal-week-grid.c
index 3955f8c7..a642fb5c 100644
--- a/src/views/gcal-week-grid.c
+++ b/src/views/gcal-week-grid.c
@@ -1153,6 +1153,8 @@ gcal_week_grid_add_event (GcalWeekGrid *self,
   end = 0;
   start = 0;
 
+  g_object_ref (event);
+
   widget = g_object_new (GCAL_TYPE_EVENT_WIDGET,
                          "event", event,
                          "orientation", GTK_ORIENTATION_VERTICAL,
@@ -1200,6 +1202,7 @@ gcal_week_grid_remove_event (GcalWeekGrid *self,
       gcal_range_tree_remove_range (self->events, data->start, data->end, data);
       destroy_event_widget (self, data->widget);
       gtk_widget_queue_allocate (GTK_WIDGET (self));
+      g_object_unref (event);
       g_free (data);
     }
 
diff --git a/src/views/gcal-week-header.c b/src/views/gcal-week-header.c
index 0c2c6671..654001b5 100644
--- a/src/views/gcal-week-header.c
+++ b/src/views/gcal-week-header.c
@@ -723,6 +723,9 @@ add_event_to_grid (GcalWeekHeader *self,
   gint position;
   gint i;
 
+  /* Take a reference to the event */
+  g_object_ref (event);
+
   /* Add at least at the first weekday */
   position = add_event_to_weekday (self, event, start);
 
@@ -1909,7 +1912,7 @@ void
 gcal_week_header_remove_event (GcalWeekHeader *self,
                                const gchar    *uuid)
 {
-  GcalEvent *removed_event;
+  g_autoptr (GcalEvent) removed_event = NULL;
   GList *children, *l;
   gint weekday;
 
diff --git a/src/views/gcal-week-view.c b/src/views/gcal-week-view.c
index c5e23c86..25267982 100644
--- a/src/views/gcal-week-view.c
+++ b/src/views/gcal-week-view.c
@@ -304,8 +304,7 @@ gcal_week_view_component_added (ECalDataModelSubscriber *subscriber,
                                 ECalComponent           *comp)
 {
   GcalWeekView *self = GCAL_WEEK_VIEW (subscriber);
-
-  GcalEvent *event;
+  g_autoptr (GcalEvent) event = NULL;
 
   GCAL_ENTRY;
 
diff --git a/src/views/gcal-year-view.c b/src/views/gcal-year-view.c
index 82cf0c8d..1fb64e8e 100644
--- a/src/views/gcal-year-view.c
+++ b/src/views/gcal-year-view.c
@@ -1800,22 +1800,27 @@ gcal_year_view_component_added (ECalDataModelSubscriber *subscriber,
                                 ECalClient              *client,
                                 ECalComponent           *comp)
 {
-  GcalYearView *self = GCAL_YEAR_VIEW (subscriber);
+  g_autoptr (GcalEvent) event = NULL;
+  GcalYearView *self;
   GDateTime *event_start, *event_end;
-  GcalEvent *event;
   GError *error;
   guint i, start_month, end_month;
 
+  GCAL_ENTRY;
+
   error = NULL;
+  self = GCAL_YEAR_VIEW (subscriber);
   event = gcal_event_new (e_client_get_source (E_CLIENT (client)), comp, &error);
 
   if (error)
     {
       g_warning ("Error creating event: %s", error->message);
       g_clear_error (&error);
-      return;
+      GCAL_RETURN ();
     }
 
+  g_debug ("Caching event '%s' in Year view", gcal_event_get_uid (event));
+
   event_start = gcal_event_get_date_start (event);
   event_end = gcal_event_get_date_end (event);
 
@@ -1836,6 +1841,8 @@ gcal_year_view_component_added (ECalDataModelSubscriber *subscriber,
   update_sidebar (self);
 
   gtk_widget_queue_draw (GTK_WIDGET (self->navigator));
+
+  GCAL_EXIT;
 }
 
 static void
@@ -1844,13 +1851,16 @@ gcal_year_view_component_removed (ECalDataModelSubscriber *subscriber,
                                   const gchar             *uid,
                                   const gchar             *rid)
 {
-  GcalYearView *year_view = GCAL_YEAR_VIEW (subscriber);
+  GcalYearView *year_view;
   GList *children, *l;
   ESource *source;
-  gchar *uuid;
+  g_autofree gchar *uuid = NULL;
   guint i;
   gint number_of_children;
 
+  GCAL_ENTRY;
+
+  year_view = GCAL_YEAR_VIEW (subscriber);
   source = e_client_get_source (E_CLIENT (client));
   if (rid != NULL)
     uuid = g_strdup_printf ("%s:%s:%s", e_source_get_uid (source), uid, rid);
@@ -1899,9 +1909,10 @@ gcal_year_view_component_removed (ECalDataModelSubscriber *subscriber,
 
           event = g_ptr_array_index (events, j);
 
-          if (g_strcmp0 (gcal_event_get_uid (event), uuid) != 0)
+          if (!g_str_equal (gcal_event_get_uid (event), uuid))
             continue;
 
+          g_debug ("Removing event '%s' from Year view's cache", uuid);
           g_ptr_array_remove (events, event);
         }
     }
@@ -1909,7 +1920,8 @@ gcal_year_view_component_removed (ECalDataModelSubscriber *subscriber,
   gtk_widget_queue_draw (GTK_WIDGET (year_view->navigator));
 
   g_list_free (children);
-  g_free (uuid);
+
+  GCAL_EXIT;
 }
 
 static void
@@ -1919,12 +1931,16 @@ gcal_year_view_component_changed (ECalDataModelSubscriber *subscriber,
 {
   ECalComponentId *id;
 
+  GCAL_ENTRY;
+
   id = e_cal_component_get_id (comp);
 
   gcal_year_view_component_removed (subscriber, client, id->uid, id->rid);
   gcal_year_view_component_added (subscriber, client, comp);
 
   g_clear_pointer (&id, e_cal_component_free_id);
+
+  GCAL_EXIT;
 }
 
 static void


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