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 10:02:48 -0400
commit474abdb3bad65cf79b0e761d962edc8b94d51dcc (patch)
treeb5914e58983b2e67a50738dc9a1c38907b69d10c
parent4dde18ac33476519f2fa7fb925d278f2de67d963 (diff)
downloadnautilus-474abdb3bad65cf79b0e761d962edc8b94d51dcc.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),