[tracker/class-signal: 44/50] tracker-store: writeback: Do the transaction trick for Writeback too



commit e931f1e0c011ffd77cb72c732741e1dce4bf59f1
Author: Philip Van Hoof <philip codeminded be>
Date:   Thu Aug 26 17:30:45 2010 +0200

    tracker-store: writeback: Do the transaction trick for Writeback too

 src/tracker-store/tracker-resources.c |    3 ++
 src/tracker-store/tracker-writeback.c |   53 ++++++++++++++++++++++++++------
 src/tracker-store/tracker-writeback.h |    1 +
 3 files changed, 47 insertions(+), 10 deletions(-)
---
diff --git a/src/tracker-store/tracker-resources.c b/src/tracker-store/tracker-resources.c
index 4deb263..87a712f 100644
--- a/src/tracker-store/tracker-resources.c
+++ b/src/tracker-store/tracker-resources.c
@@ -658,6 +658,9 @@ on_statements_committed (gpointer user_data)
 		TrackerClass *class = key;
 		tracker_class_transact_events (class);
 	}
+
+	/* Writeback feature */
+	tracker_writeback_transact ();
 }
 
 
diff --git a/src/tracker-store/tracker-writeback.c b/src/tracker-store/tracker-writeback.c
index 73c785a..f0bb8bb 100644
--- a/src/tracker-store/tracker-writeback.c
+++ b/src/tracker-store/tracker-writeback.c
@@ -28,7 +28,8 @@
 
 typedef struct {
 	GHashTable *allowances;
-	GHashTable *events;
+	GHashTable *pending_events;
+	GHashTable *ready_events;
 } WritebackPrivate;
 
 static WritebackPrivate *private;
@@ -78,13 +79,16 @@ tracker_writeback_check (gint         graph_id,
 	g_return_if_fail (private != NULL);
 
 	if (g_hash_table_lookup (private->allowances, GINT_TO_POINTER (pred_id))) {
-		if (!private->events) {
-			private->events = g_hash_table_new_full (g_direct_hash, g_direct_equal,
-			                                         (GDestroyNotify) NULL,
-			                                         (GDestroyNotify) array_free);
+		if (!private->ready_events || !private->pending_events) {
+			private->ready_events = g_hash_table_new_full (g_direct_hash, g_direct_equal,
+			                                               (GDestroyNotify) NULL,
+			                                               (GDestroyNotify) array_free);
+			private->pending_events = g_hash_table_new_full (g_direct_hash, g_direct_equal,
+			                                                 (GDestroyNotify) NULL,
+			                                                 (GDestroyNotify) NULL);
 		}
 
-		g_hash_table_insert (private->events,
+		g_hash_table_insert (private->pending_events,
 		                     GINT_TO_POINTER (subject_id),
 		                     rdf_types_to_array (rdf_types));
 	}
@@ -95,9 +99,21 @@ tracker_writeback_reset (void)
 {
 	g_return_if_fail (private != NULL);
 
-	if (private->events) {
-		g_hash_table_unref (private->events);
-		private->events = NULL;
+	if (private->pending_events && private->ready_events) {
+		GHashTableIter iter;
+		gpointer key, value;
+
+		g_hash_table_iter_init (&iter, private->pending_events);
+
+		while (g_hash_table_iter_next (&iter, &key, &value)) {
+			g_hash_table_insert (private->ready_events, key, value);
+			g_hash_table_iter_remove (&iter);
+		}
+		g_hash_table_unref (private->ready_events);
+		g_hash_table_unref (private->pending_events);
+
+		private->ready_events = NULL;
+		private->pending_events = NULL;
 	}
 }
 
@@ -106,7 +122,7 @@ tracker_writeback_get_pending (void)
 {
 	g_return_val_if_fail (private != NULL, NULL);
 
-	return private->events;
+	return private->ready_events;
 }
 
 static void
@@ -165,6 +181,23 @@ tracker_writeback_init (TrackerWritebackGetPredicatesFunc func)
 }
 
 void
+tracker_writeback_transact (void)
+{
+	GHashTableIter iter;
+	gpointer key, value;
+
+	if (!private->pending_events)
+		return;
+
+	g_hash_table_iter_init (&iter, private->pending_events);
+
+	while (g_hash_table_iter_next (&iter, &key, &value)) {
+		g_hash_table_insert (private->ready_events, key, value);
+		g_hash_table_iter_remove (&iter);
+	}
+}
+
+void
 tracker_writeback_shutdown (void)
 {
 	g_return_if_fail (private != NULL);
diff --git a/src/tracker-store/tracker-writeback.h b/src/tracker-store/tracker-writeback.h
index 907c601..b141665 100644
--- a/src/tracker-store/tracker-writeback.h
+++ b/src/tracker-store/tracker-writeback.h
@@ -41,6 +41,7 @@ void        tracker_writeback_check       (gint         graph_id,
                                            GPtrArray   *rdf_types);
 GHashTable* tracker_writeback_get_pending (void);
 void        tracker_writeback_reset       (void);
+void        tracker_writeback_transact    (void);
 
 G_END_DECLS
 



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