[gnome-photos/wip/rishi/misc-fixes: 8/18] view-model: Break a reference cycle



commit caa049e2482e6153ca1a3411a5a5ccbdff56f3bb
Author: Debarshi Ray <debarshir gnome org>
Date:   Mon Dec 14 18:32:17 2015 +0100

    view-model: Break a reference cycle
    
    A ViewModel instance can have "hidden" references held by the
    GtkTreeRowReferences of each item that is present in the model. Since
    items are owned by the ItemManager, this means that ItemManager can
    hold a strong reference to a ViewModel. Therefore, ViewModel itself
    shouldn't hold a strong reference to ItemManager. Otherwise, we would
    have a reference cycle.

 src/photos-view-model.c |   24 ++++++++++++++++++++----
 1 files changed, 20 insertions(+), 4 deletions(-)
---
diff --git a/src/photos-view-model.c b/src/photos-view-model.c
index a23d921..fee66e0 100644
--- a/src/photos-view-model.c
+++ b/src/photos-view-model.c
@@ -159,6 +159,9 @@ photos_view_model_clear (PhotosViewModel *self)
   GHashTableIter iter;
   PhotosBaseItem *item;
 
+  if (priv->item_mngr == NULL)
+    return;
+
   items = photos_base_manager_get_objects (priv->item_mngr);
   g_hash_table_iter_init (&iter, items);
   while (g_hash_table_iter_next (&iter, NULL, (gpointer *) &item))
@@ -235,6 +238,9 @@ photos_view_model_info_updated (PhotosBaseItem *item, gpointer user_data)
   GtkTreeRowReference *row_ref;
   PhotosBaseItem *active_collection;
 
+  if (priv->item_mngr == NULL)
+    return;
+
   active_collection = photos_item_manager_get_active_collection (PHOTOS_ITEM_MANAGER (priv->item_mngr));
   row_ref = (GtkTreeRowReference *) g_object_get_data (G_OBJECT (item), priv->row_ref_key);
 
@@ -297,6 +303,9 @@ photos_view_model_object_added (PhotosViewModel *self, GObject *object)
   gpointer data;
   guint info_updated_id;
 
+  if (priv->item_mngr == NULL || priv->mode_cntrlr == NULL)
+    return;
+
   row_ref = (GtkTreeRowReference *) g_object_get_data (G_OBJECT (item), priv->row_ref_key);
   if (row_ref != NULL)
     return;
@@ -436,8 +445,6 @@ photos_view_model_dispose (GObject *object)
       priv->reset_count_id = 0;
     }
 
-  g_clear_object (&priv->item_mngr);
-  g_clear_object (&priv->mode_cntrlr);
   g_clear_object (&priv->offset_cntrlr);
   g_clear_object (&priv->trk_cntrlr);
 
@@ -451,6 +458,12 @@ photos_view_model_finalize (GObject *object)
   PhotosViewModel *self = PHOTOS_VIEW_MODEL (object);
   PhotosViewModelPrivate *priv = self->priv;
 
+  if (priv->item_mngr != NULL)
+    g_object_remove_weak_pointer (G_OBJECT (priv->item_mngr), (gpointer *) &priv->item_mngr);
+
+  if (priv->mode_cntrlr != NULL)
+    g_object_remove_weak_pointer (G_OBJECT (priv->mode_cntrlr), (gpointer *) &priv->mode_cntrlr);
+
   g_hash_table_unref (priv->info_updated_ids);
   g_free (priv->row_ref_key);
 
@@ -504,8 +517,11 @@ photos_view_model_init (PhotosViewModel *self)
 
   priv->info_updated_ids = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
 
-  priv->item_mngr = g_object_ref (state->item_mngr);
-  priv->mode_cntrlr = g_object_ref (state->mode_cntrlr);
+  priv->item_mngr = state->item_mngr;
+  g_object_add_weak_pointer (G_OBJECT (priv->item_mngr), (gpointer *) &priv->item_mngr);
+
+  priv->mode_cntrlr = state->mode_cntrlr;
+  g_object_add_weak_pointer (G_OBJECT (priv->mode_cntrlr), (gpointer *) &priv->mode_cntrlr);
 
   priv->oldest_mtime = G_MAXINT64;
 }


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