[tracker] libtracker-data: Add explicit shutdown call to TrackerDataManager



commit 2ee2ebc7e18925af53d251218f469d57a65cce14
Author: Carlos Garnacho <carlosg gnome org>
Date:   Thu Jul 6 16:53:36 2017 +0200

    libtracker-data: Add explicit shutdown call to TrackerDataManager
    
    As DB interfaces will have a reference each on the TrackerDataManager,
    callers will never drop the last reference themselves. Add an
    explicit shutdown() call that just runs the dispose phase, and
    destroy the TrackerDBManager on it.
    
    Destroying the DB manager will tear down the writeable DB interface
    and unlink the "is running" file. Any remaining readonly DB interfaces
    presumably don't need the DB manager anymore and will disappear as
    soon as all their remaining cursors are closed.

 src/libtracker-data/libtracker-data.vapi   |    1 +
 src/libtracker-data/tracker-data-manager.c |   18 +++++++++++++++++-
 src/libtracker-data/tracker-data-manager.h |    2 ++
 src/libtracker-direct/tracker-direct.vala  |    5 +++++
 src/tracker-store/tracker-main.vala        |    1 +
 5 files changed, 26 insertions(+), 1 deletions(-)
---
diff --git a/src/libtracker-data/libtracker-data.vapi b/src/libtracker-data/libtracker-data.vapi
index d7e88a9..f79adb7 100644
--- a/src/libtracker-data/libtracker-data.vapi
+++ b/src/libtracker-data/libtracker-data.vapi
@@ -238,6 +238,7 @@ namespace Tracker {
                 public unowned Ontologies get_ontologies ();
                public unowned DBInterface get_db_interface ();
                public unowned Data.Update get_data ();
+               public void shutdown ();
        }
 
        [CCode (cheader_filename = "libtracker-data/tracker-db-interface-sqlite.h")]
diff --git a/src/libtracker-data/tracker-data-manager.c b/src/libtracker-data/tracker-data-manager.c
index a76c8f2..bc077fc 100644
--- a/src/libtracker-data/tracker-data-manager.c
+++ b/src/libtracker-data/tracker-data-manager.c
@@ -4531,6 +4531,16 @@ skip_ontology_check:
 }
 
 void
+tracker_data_manager_dispose (GObject *object)
+{
+       TrackerDataManager *manager = TRACKER_DATA_MANAGER (object);
+
+       g_clear_pointer (&manager->db_manager, tracker_db_manager_free);
+
+       G_OBJECT_CLASS (tracker_data_manager_parent_class)->finalize (object);
+}
+
+void
 tracker_data_manager_finalize (GObject *object)
 {
        TrackerDataManager *manager = TRACKER_DATA_MANAGER (object);
@@ -4557,7 +4567,6 @@ tracker_data_manager_finalize (GObject *object)
        }
 #endif /* DISABLE_JOURNAL */
 
-       g_clear_pointer (&manager->db_manager, tracker_db_manager_free);
        g_clear_object (&manager->ontologies);
        g_clear_object (&manager->data_update);
 
@@ -4594,6 +4603,7 @@ tracker_data_manager_class_init (TrackerDataManagerClass *klass)
        GObjectClass *object_class = G_OBJECT_CLASS (klass);
 
        object_class->get_property = tracker_data_manager_get_property;
+       object_class->dispose = tracker_data_manager_dispose;
        object_class->finalize = tracker_data_manager_finalize;
 
        g_object_class_install_property (object_class,
@@ -4642,3 +4652,9 @@ tracker_data_manager_get_data (TrackerDataManager *manager)
 {
        return manager->data_update;
 }
+
+void
+tracker_data_manager_shutdown (TrackerDataManager *manager)
+{
+       g_object_run_dispose (G_OBJECT (manager));
+}
diff --git a/src/libtracker-data/tracker-data-manager.h b/src/libtracker-data/tracker-data-manager.h
index c09e677..996389e 100644
--- a/src/libtracker-data/tracker-data-manager.h
+++ b/src/libtracker-data/tracker-data-manager.h
@@ -69,6 +69,8 @@ TrackerDataManager * tracker_data_manager_new        (TrackerDBManagerFlags   fl
                                                       guint                   select_cache_size,
                                                       guint                   update_cache_size);
 
+void                 tracker_data_manager_shutdown            (TrackerDataManager *manager);
+
 GFile *              tracker_data_manager_get_cache_location  (TrackerDataManager *manager);
 GFile *              tracker_data_manager_get_data_location   (TrackerDataManager *manager);
 TrackerDBJournal *   tracker_data_manager_get_journal_writer  (TrackerDataManager *manager);
diff --git a/src/libtracker-direct/tracker-direct.vala b/src/libtracker-direct/tracker-direct.vala
index b12ccc4..14447e1 100644
--- a/src/libtracker-direct/tracker-direct.vala
+++ b/src/libtracker-direct/tracker-direct.vala
@@ -210,6 +210,11 @@ public class Tracker.Direct.Connection : Tracker.Sparql.Connection, AsyncInitabl
                update_queue = new AsyncQueue<Task> ();
        }
 
+       public override void dispose () {
+               data_manager.shutdown ();
+               base.dispose ();
+        }
+
        Sparql.Cursor query_unlocked (string sparql) throws Sparql.Error, DBusError {
                try {
                        var query_object = new Sparql.Query (data_manager, sparql);
diff --git a/src/tracker-store/tracker-main.vala b/src/tracker-store/tracker-main.vala
index 569deed..8e6d889 100644
--- a/src/tracker-store/tracker-main.vala
+++ b/src/tracker-store/tracker-main.vala
@@ -355,6 +355,7 @@ License which can be viewed at:
                Tracker.Writeback.shutdown ();
                Tracker.Events.shutdown ();
 
+               data_manager.shutdown ();
                data_manager = null;
                Tracker.DBus.shutdown ();
                Tracker.Log.shutdown ();


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