summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCosimo Cecchi <cosimoc@gnome.org>2012-10-13 18:35:14 -0400
committerCosimo Cecchi <cosimoc@gnome.org>2012-10-15 09:51:31 -0400
commita4e65a637ca001296e4c8f25dcd8e41eac78518d (patch)
tree4095df5efce391e2fc1230c87970f71e611c7568
parent949af5d7132724c40891f629c49602de0427a2fd (diff)
downloadnautilus-a4e65a637ca001296e4c8f25dcd8e41eac78518d.tar.gz
search-directory: fix a FIXME
Using an auxiliary hash table gives us better performance for large directories, as we avoid constantly walking the list.
-rw-r--r--libnautilus-private/nautilus-search-directory.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/libnautilus-private/nautilus-search-directory.c b/libnautilus-private/nautilus-search-directory.c
index 984c78f74..551bd57a1 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),