[tracker/queue_wait_restore] tracker-store: Make set_active wait for the currently running query Fixes NB#201122



commit 6671c618e5e2ad1764eefadcc0312f1df8f29f56
Author: Philip Van Hoof <philip codeminded be>
Date:   Wed Nov 3 17:34:48 2010 +0200

    tracker-store: Make set_active wait for the currently running query
    Fixes NB#201122

 src/tracker-store/tracker-backup.c |   13 ++++---------
 src/tracker-store/tracker-main.c   |    2 +-
 src/tracker-store/tracker-store.c  |   34 +++++++++++++++++++++++-----------
 src/tracker-store/tracker-store.h  |    4 +++-
 4 files changed, 31 insertions(+), 22 deletions(-)
---
diff --git a/src/tracker-store/tracker-backup.c b/src/tracker-store/tracker-backup.c
index d030433..f73973e 100644
--- a/src/tracker-store/tracker-backup.c
+++ b/src/tracker-store/tracker-backup.c
@@ -107,8 +107,8 @@ tracker_backup_save (TrackerBackup          *object,
 	g_object_unref (destination);
 }
 
-static gboolean
-backup_idle (gpointer user_data)
+static void
+backup_idle_set_active_false_cb (gpointer user_data)
 {
 	TrackerDBusMethodInfo *info = user_data;
 	GFile *journal;
@@ -118,8 +118,6 @@ backup_idle (gpointer user_data)
 
 	journal = g_file_new_for_uri (info->journal_uri);
 
-	tracker_store_set_active (FALSE);
-
 	notifier = TRACKER_STATUS (tracker_dbus_get_object (TRACKER_TYPE_STATUS));
 
 	busy_callback = tracker_status_get_callback (notifier, 
@@ -135,11 +133,9 @@ backup_idle (gpointer user_data)
 	                             busy_callback,
 	                             busy_user_data);
 
-	tracker_store_set_active (TRUE);
-
 	g_object_unref (journal);
 
-	return FALSE;
+	tracker_store_set_active (TRUE, NULL, NULL);
 }
 
 void
@@ -163,7 +159,6 @@ tracker_backup_restore (TrackerBackup          *object,
 	info->context = context;
 	info->journal_uri = g_strdup (journal_uri);
 
-	g_idle_add (backup_idle, info);
-
+	tracker_store_set_active (FALSE, backup_idle_set_active_false_cb, info);
 }
 
diff --git a/src/tracker-store/tracker-main.c b/src/tracker-store/tracker-main.c
index 6996bce..b9d2801 100644
--- a/src/tracker-store/tracker-main.c
+++ b/src/tracker-store/tracker-main.c
@@ -521,7 +521,7 @@ main (gint argc, gchar *argv[])
 	tracker_events_init (get_notifiable_classes);
 	tracker_writeback_init (get_writeback_predicates);
 
-	tracker_store_set_active (TRUE);
+	tracker_store_set_active (TRUE, NULL, NULL);
 
 	g_message ("Waiting for D-Bus requests...");
 
diff --git a/src/tracker-store/tracker-store.c b/src/tracker-store/tracker-store.c
index 2945294..68e2a4a 100644
--- a/src/tracker-store/tracker-store.c
+++ b/src/tracker-store/tracker-store.c
@@ -45,16 +45,18 @@
 #define TRACKER_STORE_MAX_TASK_TIME          30
 
 typedef struct {
-	gboolean     start_log;
-	GQueue      *query_queues[TRACKER_STORE_N_PRIORITIES];
-	GQueue      *update_queues[TRACKER_STORE_N_PRIORITIES];
-	guint        n_queries_running;
-	gboolean     update_running;
-	GThreadPool *update_pool;
-	GThreadPool *query_pool;
-	GSList      *running_tasks;
-	guint        max_task_time;
-	gboolean     active;
+	gboolean       start_log;
+	GQueue        *query_queues[TRACKER_STORE_N_PRIORITIES];
+	GQueue        *update_queues[TRACKER_STORE_N_PRIORITIES];
+	guint          n_queries_running;
+	gboolean       update_running;
+	GThreadPool   *update_pool;
+	GThreadPool   *query_pool;
+	GSList        *running_tasks;
+	guint          max_task_time;
+	gboolean       active;
+	GDestroyNotify active_callback;
+	gpointer       active_user_data;
 } TrackerStorePrivate;
 
 typedef enum {
@@ -288,6 +290,11 @@ task_finish_cb (gpointer data)
 
 	store_task_free (task);
 
+	if (private->active_callback) {
+		private->active_callback (private->active_user_data);
+		private->active_callback = NULL;
+	}
+
 	sched (private);
 
 	return FALSE;
@@ -647,11 +654,16 @@ tracker_store_unreg_batches (const gchar *client_id)
 }
 
 void
-tracker_store_set_active (gboolean active)
+tracker_store_set_active (gboolean       active,
+                          GDestroyNotify callback,
+                          gpointer       user_data)
 {
 	TrackerStorePrivate *private;
 
 	private = g_static_private_get (&private_key);
+
+	private->active_callback = callback;
+	private->active_user_data = user_data;
 	private->active = active;
 
 	sched (private);
diff --git a/src/tracker-store/tracker-store.h b/src/tracker-store/tracker-store.h
index 50c9fc1..46a6704 100644
--- a/src/tracker-store/tracker-store.h
+++ b/src/tracker-store/tracker-store.h
@@ -83,7 +83,9 @@ guint        tracker_store_get_queue_size         (void);
 
 void         tracker_store_unreg_batches          (const gchar   *client_id);
 
-void         tracker_store_set_active             (gboolean       active);
+void         tracker_store_set_active             (gboolean       active,
+                                                   GDestroyNotify callback,
+                                                   gpointer       user_data);
 
 G_END_DECLS
 



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