[tracker/tracker-store] Arbitrary lowering priority of SetMany() items



commit eecc88fba6892f0cee0520ca03736daf74850ee9
Author: Philip Van Hoof <philip codeminded be>
Date:   Mon Jun 15 12:22:28 2009 +0200

    Arbitrary lowering priority of SetMany() items

 .../evolution/tracker-evolution-registrar.c        |   91 ++++++++++++++++-
 src/plugins/kmail/tracker-kmail-registrar.c        |  104 +++++++++++++++++--
 2 files changed, 179 insertions(+), 16 deletions(-)
---
diff --git a/src/plugins/evolution/tracker-evolution-registrar.c b/src/plugins/evolution/tracker-evolution-registrar.c
index 31be1ea..25dc054 100644
--- a/src/plugins/evolution/tracker-evolution-registrar.c
+++ b/src/plugins/evolution/tracker-evolution-registrar.c
@@ -66,7 +66,6 @@ struct TrackerEvolutionPushRegistrarClass {
 	TrackerPushRegistrarClass parent_class;
 };
 
-
 typedef struct {
 	gpointer dummy;
 } TrackerEvolutionRegistrarPrivate;
@@ -75,6 +74,17 @@ enum {
 	PROP_0,
 };
 
+
+typedef struct {
+	guint modseq;
+	gchar *subject;
+	GStrv predicates;
+	GStrv values;
+} QueuedSet;
+
+static GQueue *many_queue = NULL;
+#define QUEUED_SETS_PER_MAINLOOP 2
+
 static GType tracker_evolution_push_registrar_get_type (void) G_GNUC_CONST;
 
 G_DEFINE_TYPE (TrackerEvolutionRegistrar, tracker_evolution_registrar, G_TYPE_OBJECT)
@@ -645,6 +655,63 @@ on_commit (gpointer user_data)
 	set_stored_last_modseq (GPOINTER_TO_UINT (user_data));
 }
 
+static void
+queued_set_free (QueuedSet *queued_set)
+{
+	g_free (queued_set->subject);
+	g_strfreev (queued_set->values);
+	g_strfreev (queued_set->predicates);
+	g_slice_free (QueuedSet, queued_set);
+}
+
+static gboolean 
+many_idle_handler (gpointer user_data)
+{
+	guint i, last_modseq = 0;
+	QueuedSet *queued_set = GUINT_TO_POINTER (1);
+	TrackerEvolutionRegistrar *object = user_data;
+
+	for (i = 0; i < QUEUED_SETS_PER_MAINLOOP && queued_set ; i++) {
+		queued_set = g_queue_pop_head (many_queue);
+
+		if (queued_set) {
+			perform_set (object,
+			             queued_set->subject,
+			             queued_set->predicates,
+			             queued_set->values);
+
+			if (last_modseq != queued_set->modseq) {
+				tracker_store_queue_commit (on_commit, 
+				                            GUINT_TO_POINTER (queued_set->modseq), 
+				                            NULL);
+			}
+
+			last_modseq = queued_set->modseq;
+
+			queued_set_free (queued_set);
+		} 
+	}
+
+	return (gboolean) queued_set;
+}
+
+static void
+many_idle_destroy (gpointer user_data)
+{
+	g_queue_free (many_queue);
+	many_queue = NULL;
+	g_object_unref (user_data);
+}
+
+static void
+start_many_handler (TrackerEvolutionRegistrar *object)
+{
+	g_idle_add_full (G_PRIORITY_LOW,
+	                 many_idle_handler,
+	                 g_object_ref (object),
+	                 many_idle_destroy);
+}
+
 void
 tracker_evolution_registrar_set_many (TrackerEvolutionRegistrar *object, 
 				      const GStrv subjects, 
@@ -655,6 +722,7 @@ tracker_evolution_registrar_set_many (TrackerEvolutionRegistrar *object,
 				      GError *derror)
 {
 	guint len, i = 0;
+	gboolean start_handler = FALSE;
 
 	dbus_async_return_if_fail (subjects != NULL, context);
 	dbus_async_return_if_fail (predicates != NULL, context);
@@ -665,14 +733,27 @@ tracker_evolution_registrar_set_many (TrackerEvolutionRegistrar *object,
 	dbus_async_return_if_fail (len == predicates->len, context);
 	dbus_async_return_if_fail (len == values->len, context);
 
+	if (!many_queue) {
+		many_queue = g_queue_new ();
+		start_handler = TRUE;
+	}
+
 	while (subjects[i] != NULL) {
-		GStrv preds = g_ptr_array_index (predicates, i);
-		GStrv vals = g_ptr_array_index (values, i);
-		perform_set (object, subjects[i], preds, vals);
+		QueuedSet *queued_set = g_slice_new (QueuedSet);
+
+		queued_set->subject = g_strdup (subjects[1]);
+		queued_set->predicates = g_strdupv (g_ptr_array_index (predicates, i));
+		queued_set->values = g_strdupv (g_ptr_array_index (values, i));
+		queued_set->modseq = modseq;
+
+		g_queue_push_tail (many_queue, queued_set);
+
 		i++;
 	}
 
-	tracker_store_queue_commit (on_commit, GUINT_TO_POINTER (modseq), NULL);
+	if (start_handler) {
+		start_many_handler (object);
+	}
 
 	dbus_g_method_return (context);
 }
diff --git a/src/plugins/kmail/tracker-kmail-registrar.c b/src/plugins/kmail/tracker-kmail-registrar.c
index e5f402b..ee5fd4e 100644
--- a/src/plugins/kmail/tracker-kmail-registrar.c
+++ b/src/plugins/kmail/tracker-kmail-registrar.c
@@ -64,7 +64,6 @@ struct TrackerKMailPushRegistrarClass {
 	TrackerPushRegistrarClass parent_class;
 };
 
-
 typedef struct {
 	gpointer dummy;
 } TrackerKMailRegistrarPrivate;
@@ -73,6 +72,17 @@ enum {
 	PROP_0,
 };
 
+
+typedef struct {
+	guint modseq;
+	gchar *subject;
+	GStrv predicates;
+	GStrv values;
+} QueuedSet;
+
+static GQueue *many_queue = NULL;
+#define QUEUED_SETS_PER_MAINLOOP 2
+
 static GType tracker_kmail_push_registrar_get_type (void) G_GNUC_CONST;
 
 G_DEFINE_TYPE (TrackerKMailRegistrar, tracker_kmail_registrar, G_TYPE_OBJECT)
@@ -409,16 +419,74 @@ on_commit (gpointer user_data)
 	set_stored_last_modseq (GPOINTER_TO_UINT (user_data));
 }
 
+static void
+queued_set_free (QueuedSet *queued_set)
+{
+	g_free (queued_set->subject);
+	g_strfreev (queued_set->values);
+	g_strfreev (queued_set->predicates);
+	g_slice_free (QueuedSet, queued_set);
+}
+
+static gboolean 
+many_idle_handler (gpointer user_data)
+{
+	guint i, last_modseq = 0;
+	QueuedSet *queued_set = GUINT_TO_POINTER (1);
+	TrackerKMailRegistrar *object = user_data;
+
+	for (i = 0; i < QUEUED_SETS_PER_MAINLOOP && queued_set ; i++) {
+		queued_set = g_queue_pop_head (many_queue);
+
+		if (queued_set) {
+			perform_set (object,
+			             queued_set->subject,
+			             queued_set->predicates,
+			             queued_set->values);
+
+			if (last_modseq != queued_set->modseq) {
+				tracker_store_queue_commit (on_commit, 
+				                            GUINT_TO_POINTER (queued_set->modseq), 
+				                            NULL);
+			}
+
+			last_modseq = queued_set->modseq;
+
+			queued_set_free (queued_set);
+		} 
+	}
+
+	return (gboolean) queued_set;
+}
+
+static void
+many_idle_destroy (gpointer user_data)
+{
+	g_queue_free (many_queue);
+	many_queue = NULL;
+	g_object_unref (user_data);
+}
+
+static void
+start_many_handler (TrackerKMailRegistrar *object)
+{
+	g_idle_add_full (G_PRIORITY_LOW,
+	                 many_idle_handler,
+	                 g_object_ref (object),
+	                 many_idle_destroy);
+}
+
 void
 tracker_kmail_registrar_set_many (TrackerKMailRegistrar *object, 
-				      const GStrv subjects, 
-				      const GPtrArray *predicates,
-				      const GPtrArray *values,
-				      const guint modseq,
-				      DBusGMethodInvocation *context,
-				      GError *derror)
+				  const GStrv subjects, 
+				  const GPtrArray *predicates,
+				  const GPtrArray *values,
+				  const guint modseq,
+				  DBusGMethodInvocation *context,
+				  GError *derror)
 {
 	guint len, i = 0;
+	gboolean start_handler = FALSE;
 
 	dbus_async_return_if_fail (subjects != NULL, context);
 	dbus_async_return_if_fail (predicates != NULL, context);
@@ -429,20 +497,34 @@ tracker_kmail_registrar_set_many (TrackerKMailRegistrar *object,
 	dbus_async_return_if_fail (len == predicates->len, context);
 	dbus_async_return_if_fail (len == values->len, context);
 
+	if (!many_queue) {
+		many_queue = g_queue_new ();
+		start_handler = TRUE;
+	}
+
 	while (subjects[i] != NULL) {
-		GStrv preds = g_ptr_array_index (predicates, i);
-		GStrv vals = g_ptr_array_index (values, i);
-		perform_set (object, subjects[i], preds, vals);
+		QueuedSet *queued_set = g_slice_new (QueuedSet);
+
+		queued_set->subject = g_strdup (subjects[1]);
+		queued_set->predicates = g_strdupv (g_ptr_array_index (predicates, i));
+		queued_set->values = g_strdupv (g_ptr_array_index (values, i));
+		queued_set->modseq = modseq;
+
+		g_queue_push_tail (many_queue, queued_set);
+
 		i++;
 	}
 
-	tracker_store_queue_commit (on_commit, GUINT_TO_POINTER (modseq), NULL);
+	if (start_handler) {
+		start_many_handler (object);
+	}
 
 	dbus_g_method_return (context);
 }
 
 
 
+
 void
 tracker_kmail_registrar_unset_many (TrackerKMailRegistrar *object, 
 				    const GStrv subjects, 



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