[tracker/hierarchical-indexing] TrackerMiner: Cancel pending async calls on dispose.



commit 1e8b53fe166b021e61cb74705abf7ee5908ce76c
Author: Carlos Garnacho <carlos lanedo com>
Date:   Thu Feb 18 16:11:29 2010 +0100

    TrackerMiner: Cancel pending async calls on dispose.
    
    GSimpleAsyncResult tries to reference the object (the miner in this
    case), so it likely crashed when trying to ref an object being
    destroyed. Instead do it on dispose, when the object is still alive,
    but about to be destroyed.

 src/libtracker-miner/tracker-miner.c |   18 +++++++++++++-----
 src/tracker-miner-fs/tracker-main.c  |    9 ++++++++-
 2 files changed, 21 insertions(+), 6 deletions(-)
---
diff --git a/src/libtracker-miner/tracker-miner.c b/src/libtracker-miner/tracker-miner.c
index 4d7e95e..f5f360d 100644
--- a/src/libtracker-miner/tracker-miner.c
+++ b/src/libtracker-miner/tracker-miner.c
@@ -118,6 +118,7 @@ static void       miner_get_property           (GObject       *object,
                                                 GValue        *value,
                                                 GParamSpec    *pspec);
 static void       miner_finalize               (GObject       *object);
+static void       miner_dispose                (GObject       *object);
 static void       miner_constructed            (GObject       *object);
 static void       dbus_data_destroy            (gpointer       data);
 static DBusData * dbus_data_new                (TrackerMiner  *miner,
@@ -144,6 +145,7 @@ tracker_miner_class_init (TrackerMinerClass *klass)
 	object_class->get_property = miner_get_property;
 	object_class->finalize     = miner_finalize;
 	object_class->constructed  = miner_constructed;
+	object_class->dispose      = miner_dispose;
 
 	/**
 	 * TrackerMiner::started:
@@ -400,7 +402,17 @@ async_call_finalize_foreach (AsyncCallData *data,
                              gpointer       user_data)
 {
 	async_call_data_notify_error (data, 0, "Miner is being finalized");
-	async_call_data_destroy (data, FALSE);
+	async_call_data_destroy (data, TRUE);
+}
+
+static void
+miner_dispose (GObject *object)
+{
+	TrackerMiner *miner = TRACKER_MINER (object);
+
+	g_ptr_array_foreach (miner->private->async_calls,
+	                     (GFunc) async_call_finalize_foreach,
+	                     object);
 }
 
 static void
@@ -420,10 +432,6 @@ miner_finalize (GObject *object)
 	}
 
 	g_hash_table_unref (miner->private->pauses);
-
-	g_ptr_array_foreach (miner->private->async_calls,
-	                     (GFunc) async_call_finalize_foreach,
-	                     object);
 	g_ptr_array_free (miner->private->async_calls, TRUE);
 
 	G_OBJECT_CLASS (tracker_miner_parent_class)->finalize (object);
diff --git a/src/tracker-miner-fs/tracker-main.c b/src/tracker-miner-fs/tracker-main.c
index a4576f6..83aea1e 100644
--- a/src/tracker-miner-fs/tracker-main.c
+++ b/src/tracker-miner-fs/tracker-main.c
@@ -224,6 +224,13 @@ miner_finished_cb (TrackerMinerFS *fs,
 	miner_handle_next ();
 }
 
+static void
+finalize_miner (TrackerMiner *miner)
+{
+	g_object_run_dispose (G_OBJECT (miner));
+	g_object_unref (G_OBJECT (miner));
+}
+
 int
 main (gint argc, gchar *argv[])
 {
@@ -372,7 +379,7 @@ main (gint argc, gchar *argv[])
 
 	tracker_thumbnailer_shutdown ();
 
-	g_slist_foreach (miners, (GFunc) g_object_unref, NULL);
+	g_slist_foreach (miners, (GFunc) finalize_miner, NULL);
 	g_slist_free (miners);
 
 	tracker_dbus_shutdown ();



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