From 194407ecfba972519de336178faca47855751128 Mon Sep 17 00:00:00 2001 From: Georges Basile Stavracas Neto Date: Sun, 28 Jan 2018 12:08:04 -0200 Subject: [PATCH] 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