[tracker/tracker-store-queue] Fixed the TTL loader to yield to the GMainLoop while queuing up



commit f95f031d4298010d2986ee68eebfbac4b306ce42
Author: Philip Van Hoof <philip codeminded be>
Date:   Thu May 21 18:15:29 2009 +0200

    Fixed the TTL loader to yield to the GMainLoop while queuing up
---
 src/tracker-store/tracker-resources.c   |   49 ++++++++++++++++++++++++------
 src/tracker-store/tracker-store-queue.c |    3 +-
 2 files changed, 41 insertions(+), 11 deletions(-)

diff --git a/src/tracker-store/tracker-resources.c b/src/tracker-store/tracker-resources.c
index 551aa59..51d4447 100644
--- a/src/tracker-store/tracker-resources.c
+++ b/src/tracker-store/tracker-resources.c
@@ -290,10 +290,13 @@ turtle_update_callback (GError *error, gpointer user_data)
 	g_object_unref (object);
 }
 
-static void
-process_turtle_file_part (TrackerResources *object)
+static gboolean
+process_turtle_idle (gpointer user_data)
 {
+	TrackerResources *object = user_data;
 	TrackerResourcesPrivate *priv;
+	guint i = 0;
+	gboolean cont = FALSE;
 
 	priv = TRACKER_RESOURCES_GET_PRIVATE (object);
 
@@ -303,19 +306,42 @@ process_turtle_file_part (TrackerResources *object)
 	}
 
 	while (tracker_turtle_reader_next ()) {
-		tracker_store_queue_batch_insert_statement (tracker_turtle_reader_get_subject (),
-		                                            tracker_turtle_reader_get_predicate (),
-		                                            tracker_turtle_reader_get_object (),
-		                                            turtle_update_callback,
-		                                            g_object_ref (object),
-		                                            NULL);
+		const gchar *subject = tracker_turtle_reader_get_subject ();
+		const gchar *predicate = tracker_turtle_reader_get_predicate ();
+		const gchar *object_ = tracker_turtle_reader_get_object ();
+
+		if (subject && predicate && object_) {
+			tracker_store_queue_batch_insert_statement (subject,
+			                                            predicate,
+			                                            object_,
+			                                            turtle_update_callback,
+			                                            g_object_ref (object),
+			                                            NULL);
+		}
+
+		cont = TRUE;
+
+		if (i > 100) {
+			break;
+		}
+
+		i++;
 	}
 
+	return cont;
+}
+
+static void
+process_turtle_destroy (gpointer user_data)
+{
+	TrackerResources *object = user_data;
+
 	tracker_store_queue_batch_commit (turtle_commit_callback,
 	                                  g_object_ref (object),
 	                                  NULL);
-}
 
+	g_object_unref (object);
+}
 
 void
 tracker_resources_load (TrackerResources	 *object,
@@ -342,7 +368,10 @@ tracker_resources_load (TrackerResources	 *object,
 
 	tracker_turtle_reader_init (path, NULL);
 
-	process_turtle_file_part (object);
+	g_idle_add_full (G_PRIORITY_DEFAULT,
+	                 process_turtle_idle,
+	                 g_object_ref (object),
+	                 process_turtle_destroy);
 
 	g_free (path);
 	g_object_unref (file);
diff --git a/src/tracker-store/tracker-store-queue.c b/src/tracker-store/tracker-store-queue.c
index f19a6cd..54673f9 100644
--- a/src/tracker-store/tracker-store-queue.c
+++ b/src/tracker-store/tracker-store-queue.c
@@ -83,7 +83,7 @@ tracker_store_queue_task_free (TrackerStoreQueueTask *task)
 	if (task->type >= TRACKER_STORE_QUEUE_TASK_TYPE_INSERT_STATEMENT) {
 		g_free (task->data.statement.subject);
 		g_free (task->data.statement.predicate);
-		g_free (task->data.statement.predicate);
+		g_free (task->data.statement.object);
 	} else {
 		g_free (task->data.query);
 	}
@@ -225,6 +225,7 @@ static void
 start_handler (TrackerStoreQueuePrivate *private) 
 {
 	im_done = FALSE;
+	private->have_handler = TRUE;
 
 	g_idle_add_full (G_PRIORITY_DEFAULT,
 	                 queue_idle_handler,



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