[nautilus/gnome-3-6] search-directory: fix a FIXME



commit 474abdb3bad65cf79b0e761d962edc8b94d51dcc
Author: Cosimo Cecchi <cosimoc gnome org>
Date:   Sat Oct 13 18:35:14 2012 -0400

    search-directory: fix a FIXME
    
    Using an auxiliary hash table gives us better performance for large
    directories, as we avoid constantly walking the list.

 libnautilus-private/nautilus-search-directory.c |   12 +++++++++---
 1 files changed, 9 insertions(+), 3 deletions(-)
---
diff --git a/libnautilus-private/nautilus-search-directory.c b/libnautilus-private/nautilus-search-directory.c
index 984c78f..551bd57 100644
--- a/libnautilus-private/nautilus-search-directory.c
+++ b/libnautilus-private/nautilus-search-directory.c
@@ -49,6 +49,7 @@ struct NautilusSearchDirectoryDetails {
 	gboolean search_finished;
 
 	GList *files;
+	GHashTable *files_hash;
 
 	GList *monitor_list;
 	GList *callback_list;
@@ -119,6 +120,8 @@ reset_file_list (NautilusSearchDirectory *search)
 	
 	nautilus_file_list_free (search->details->files);
 	search->details->files = NULL;
+
+	g_hash_table_remove_all (search->details->files_hash);
 }
 
 static void
@@ -530,6 +533,7 @@ search_engine_hits_added (NautilusSearchEngine *engine, GList *hits,
 		g_signal_connect (file, "changed", G_CALLBACK (file_changed), search),
 
 		file_list = g_list_prepend (file_list, file);
+		g_hash_table_replace (search->details->files_hash, file, GINT_TO_POINTER (1));
 	}
 	
 	search->details->files = g_list_concat (search->details->files, file_list);
@@ -657,9 +661,7 @@ search_contains_file (NautilusDirectory *directory,
 	NautilusSearchDirectory *search;
 
 	search = NAUTILUS_SEARCH_DIRECTORY (directory);
-
-	/* FIXME: Maybe put the files in a hash */
-	return (g_list_find (search->details->files, file) != NULL);
+	return (g_hash_table_lookup (search->details->files_hash, file) != NULL);
 }
 
 static GList *
@@ -784,6 +786,8 @@ search_finalize (GObject *object)
 	search = NAUTILUS_SEARCH_DIRECTORY (object);
 	g_free (search->details->saved_search_uri);
 
+	g_hash_table_destroy (search->details->files_hash);
+
 	G_OBJECT_CLASS (nautilus_search_directory_parent_class)->finalize (object);
 }
 
@@ -793,6 +797,8 @@ nautilus_search_directory_init (NautilusSearchDirectory *search)
 	search->details = G_TYPE_INSTANCE_GET_PRIVATE (search, NAUTILUS_TYPE_SEARCH_DIRECTORY,
 						       NautilusSearchDirectoryDetails);
 
+	search->details->files_hash = g_hash_table_new (g_direct_hash, g_direct_equal);
+
 	search->details->engine = nautilus_search_engine_new ();
 	g_signal_connect (search->details->engine, "hits-added",
 			  G_CALLBACK (search_engine_hits_added),



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