[tracker/external-crawler: 43/45] libtracker-miner: Fixed several memory leaks



commit 94dd78828042d5652b49e8a63f01ba938c805179
Author: Martyn Russell <martyn lanedo com>
Date:   Tue Aug 12 19:29:35 2014 +0100

    libtracker-miner: Fixed several memory leaks
    
    In crawler, file-data-provider and file-notifier

 src/libtracker-miner/tracker-crawler.c            |   33 ++++++++++++++++----
 src/libtracker-miner/tracker-file-data-provider.c |    1 +
 src/libtracker-miner/tracker-file-notifier.c      |    4 ++
 3 files changed, 31 insertions(+), 7 deletions(-)
---
diff --git a/src/libtracker-miner/tracker-crawler.c b/src/libtracker-miner/tracker-crawler.c
index 029f8f7..f74c848 100644
--- a/src/libtracker-miner/tracker-crawler.c
+++ b/src/libtracker-miner/tracker-crawler.c
@@ -303,6 +303,10 @@ crawler_finalize (GObject *object)
 
        g_free (priv->file_attributes);
 
+       if (priv->data_provider) {
+               g_object_unref (priv->data_provider);
+       }
+
        G_OBJECT_CLASS (tracker_crawler_parent_class)->finalize (object);
 }
 
@@ -324,14 +328,29 @@ check_contents_defaults (TrackerCrawler  *crawler,
 TrackerCrawler *
 tracker_crawler_new (TrackerDataProvider *data_provider)
 {
-       if (!data_provider) {
+       TrackerCrawler *crawler;
+       TrackerDataProvider *default_data_provider = NULL;
+
+       if (G_LIKELY (!data_provider)) {
                /* Default to the file data_provider if none is passed */
-               data_provider = tracker_file_data_provider_new ();
+               data_provider = default_data_provider = tracker_file_data_provider_new ();
+       }
+
+       crawler = g_object_new (TRACKER_TYPE_CRAWLER,
+                               "data-provider", data_provider,
+                               NULL);
+
+       /* When a data provider is passed to us, we add a reference in
+        * the set_properties() function for this class, however, if
+        * we create the data provider, we also have the original
+        * reference for the created object which needs to be cleared
+        * up here.
+        */
+       if (default_data_provider) {
+               g_object_unref (default_data_provider);
        }
 
-       return g_object_new (TRACKER_TYPE_CRAWLER,
-                            "data-provider", data_provider,
-                            NULL);
+       return crawler;
 }
 
 static gboolean
@@ -822,8 +841,8 @@ enumerate_next_cb (GObject      *object,
                process_func_start (dpd->crawler);
                data_provider_data_free (dpd);
        } else {
-               /* More work to do */
-               dpd->files = g_slist_prepend (dpd->files, g_object_ref (info));
+               /* More work to do, we keep reference given to us */
+               dpd->files = g_slist_prepend (dpd->files, info);
 
                tracker_enumerator_next_async (TRACKER_ENUMERATOR (object),
                                               G_PRIORITY_LOW,
diff --git a/src/libtracker-miner/tracker-file-data-provider.c 
b/src/libtracker-miner/tracker-file-data-provider.c
index 4bd6bb0..6e22396 100644
--- a/src/libtracker-miner/tracker-file-data-provider.c
+++ b/src/libtracker-miner/tracker-file-data-provider.c
@@ -160,6 +160,7 @@ file_data_provider_begin (TrackerDataProvider  *data_provider,
        }
 
        enumerator = tracker_file_enumerator_new (fe);
+       g_object_unref (fe);
 
        return TRACKER_ENUMERATOR (enumerator);
 }
diff --git a/src/libtracker-miner/tracker-file-notifier.c b/src/libtracker-miner/tracker-file-notifier.c
index b332385..42165c9 100644
--- a/src/libtracker-miner/tracker-file-notifier.c
+++ b/src/libtracker-miner/tracker-file-notifier.c
@@ -1328,6 +1328,10 @@ tracker_file_notifier_finalize (GObject *object)
                g_object_unref (priv->indexing_tree);
        }
 
+       if (priv->data_provider) {
+               g_object_unref (priv->data_provider);
+       }
+
        g_object_unref (priv->crawler);
        g_object_unref (priv->monitor);
        g_object_unref (priv->file_system);


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