[nautilus] search-engine: wait for all engine's completion before starting



commit b610e53b09a7b8474883d92675205fa2a9271e97
Author: Cosimo Cecchi <cosimoc gnome org>
Date:   Sun Oct 14 13:39:56 2012 -0400

    search-engine: wait for all engine's completion before starting
    
    When we're getting reloaded, we should wait for the completion of all
    engines before triggering a new search. When this happens, set an
    internal restart flag and apply it when the last provider returns.
    This avoids finished signals from providers that complete the previous
    search after a while to being interpreted for the current search.

 libnautilus-private/nautilus-search-engine.c |   47 ++++++++++++++++++++++++--
 1 files changed, 44 insertions(+), 3 deletions(-)
---
diff --git a/libnautilus-private/nautilus-search-engine.c b/libnautilus-private/nautilus-search-engine.c
index be2b2f0..91e6616 100644
--- a/libnautilus-private/nautilus-search-engine.c
+++ b/libnautilus-private/nautilus-search-engine.c
@@ -47,6 +47,9 @@ struct NautilusSearchEngineDetails
 	guint providers_running;
 	guint providers_finished;
 	guint providers_error;
+
+	gboolean running;
+	gboolean restart;
 };
 
 static void nautilus_search_provider_init (NautilusSearchProviderIface  *iface);
@@ -70,14 +73,14 @@ nautilus_search_engine_set_query (NautilusSearchProvider *provider,
 }
 
 static void
-nautilus_search_engine_start (NautilusSearchProvider *provider)
+search_engine_start_real (NautilusSearchEngine *engine)
 {
-	NautilusSearchEngine *engine = NAUTILUS_SEARCH_ENGINE (provider);
-
 	engine->details->providers_running = 0;
 	engine->details->providers_finished = 0;
 	engine->details->providers_error = 0;
 
+	engine->details->restart = FALSE;
+
 #ifdef ENABLE_TRACKER
 	nautilus_search_provider_start (NAUTILUS_SEARCH_PROVIDER (engine->details->tracker));
 	engine->details->providers_running++;
@@ -92,6 +95,32 @@ nautilus_search_engine_start (NautilusSearchProvider *provider)
 }
 
 static void
+nautilus_search_engine_start (NautilusSearchProvider *provider)
+{
+	NautilusSearchEngine *engine = NAUTILUS_SEARCH_ENGINE (provider);
+	gint num_finished;
+
+	num_finished = engine->details->providers_error + engine->details->providers_finished;
+
+	if (engine->details->running) {
+		if (num_finished == engine->details->providers_running &&
+		    engine->details->restart) {
+			search_engine_start_real (engine);
+		}
+
+		return;
+	}
+
+	engine->details->running = TRUE;
+
+	if (num_finished < engine->details->providers_running) {
+		engine->details->restart = TRUE;
+	} else {
+		search_engine_start_real (engine);
+	}
+}
+
+static void
 nautilus_search_engine_stop (NautilusSearchProvider *provider)
 {
 	NautilusSearchEngine *engine = NAUTILUS_SEARCH_ENGINE (provider);
@@ -100,6 +129,9 @@ nautilus_search_engine_stop (NautilusSearchProvider *provider)
 #endif
 	nautilus_search_provider_stop (NAUTILUS_SEARCH_PROVIDER (engine->details->model));
 	nautilus_search_provider_stop (NAUTILUS_SEARCH_PROVIDER (engine->details->simple));
+
+	engine->details->running = FALSE;
+	engine->details->restart = FALSE;
 }
 
 static void
@@ -110,6 +142,10 @@ search_provider_hits_added (NautilusSearchProvider *provider,
 	GList *added = NULL;
 	GList *l;
 
+	if (!engine->details->running || engine->details->restart) {
+		return;
+	}
+
 	for (l = hits; l != NULL; l = l->next) {
 		NautilusSearchHit *hit = l->data;
 		int count;
@@ -175,8 +211,13 @@ check_providers_status (NautilusSearchEngine *engine)
 		nautilus_search_provider_finished (NAUTILUS_SEARCH_PROVIDER (engine));
 	}
 
+	engine->details->running = FALSE;
 	g_hash_table_remove_all (engine->details->uris);
 	g_object_unref (engine);
+
+	if (engine->details->restart) {
+		nautilus_search_engine_start (NAUTILUS_SEARCH_PROVIDER (engine));
+	}
 }
 
 static void



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