summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2005-09-06 15:12:46 +0000
committerAlexander Larsson <alexl@src.gnome.org>2005-09-06 15:12:46 +0000
commitb32d6453ad9063fb95e50d3b1fd2fbcbfea42ae8 (patch)
treed964acfc905028e520bfe81d4fb37086e4d3dca9
parent5f2794aed462ea2b1a467b2d2a48621315059891 (diff)
downloadnautilus-b32d6453ad9063fb95e50d3b1fd2fbcbfea42ae8.tar.gz
Only use directory monitors to avoid using lots and lots of file monitors.
2005-09-06 Alexander Larsson <alexl@redhat.com> * libnautilus-private/nautilus-directory-async.c: (nautilus_directory_monitor_add_internal), (nautilus_directory_monitor_remove_internal): * libnautilus-private/nautilus-file-private.h: * libnautilus-private/nautilus-file.c: (finalize): Only use directory monitors to avoid using lots and lots of file monitors. This is an optimization in almost all cases, although it does a bit more work when viewing a file properties dialog with the containing folder window hidden. (#315041)
-rw-r--r--ChangeLog12
-rw-r--r--libnautilus-private/nautilus-directory-async.c62
-rw-r--r--libnautilus-private/nautilus-file-private.h2
-rw-r--r--libnautilus-private/nautilus-file.c4
4 files changed, 22 insertions, 58 deletions
diff --git a/ChangeLog b/ChangeLog
index e3d31e229..1253c2985 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2005-09-06 Alexander Larsson <alexl@redhat.com>
+
+ * libnautilus-private/nautilus-directory-async.c:
+ (nautilus_directory_monitor_add_internal),
+ (nautilus_directory_monitor_remove_internal):
+ * libnautilus-private/nautilus-file-private.h:
+ * libnautilus-private/nautilus-file.c: (finalize):
+ Only use directory monitors to avoid using lots and lots of
+ file monitors. This is an optimization in almost all cases, although
+ it does a bit more work when viewing a file properties dialog with the
+ containing folder window hidden. (#315041)
+
2005-09-06 Christian Neumair <chris@gnome-de.org>
* src/file-manager/fm-directory-view.c: (add_extension_menu_items),
diff --git a/libnautilus-private/nautilus-directory-async.c b/libnautilus-private/nautilus-directory-async.c
index a3288c3b5..7d7f1d5c5 100644
--- a/libnautilus-private/nautilus-directory-async.c
+++ b/libnautilus-private/nautilus-directory-async.c
@@ -479,35 +479,6 @@ find_monitor (NautilusDirectory *directory,
monitor_key_compare);
}
-static int
-monitor_file_compare (gconstpointer a,
- gconstpointer data)
-{
- const Monitor *monitor;
- NautilusFile *file;
-
- monitor = a;
- file = (NautilusFile *) data;
-
- if (monitor->file < file) {
- return -1;
- }
- if (monitor->file > file) {
- return +1;
- }
-
- return 0;
-}
-
-static gboolean
-find_any_monitor (NautilusDirectory *directory,
- NautilusFile *file)
-{
- return g_list_find_custom (directory->details->monitor_list,
- file,
- monitor_file_compare) != NULL;
-}
-
static void
remove_monitor_link (NautilusDirectory *directory,
GList *link)
@@ -623,7 +594,6 @@ nautilus_directory_monitor_add_internal (NautilusDirectory *directory,
{
Monitor *monitor;
GList *file_list;
- char *file_uri;
g_assert (NAUTILUS_IS_DIRECTORY (directory));
@@ -649,16 +619,12 @@ nautilus_directory_monitor_add_internal (NautilusDirectory *directory,
}
/* Start the "real" monitoring (FAM or whatever). */
- if (file == NULL) {
- if (directory->details->monitor == NULL) {
- directory->details->monitor = nautilus_monitor_directory (directory->details->uri);
- }
- } else {
- if (file->details->monitor == NULL) {
- file_uri = nautilus_file_get_uri (file);
- file->details->monitor = nautilus_monitor_file (file_uri);
- g_free (file_uri);
- }
+ /* We always monitor the whole directory since in practice
+ * nautilus almost always shows the whole directory anyway, and
+ * it allows us to avoid one file monitor per file in a directory.
+ */
+ if (directory->details->monitor == NULL) {
+ directory->details->monitor = nautilus_monitor_directory (directory->details->uri);
}
/* We could just call update_metadata_monitors here, but we can be smarter
@@ -1129,18 +1095,10 @@ nautilus_directory_monitor_remove_internal (NautilusDirectory *directory,
remove_monitor (directory, file, client);
- if (file == NULL) {
- if (directory->details->monitor != NULL
- && !find_any_monitor (directory, NULL)) {
- nautilus_monitor_cancel (directory->details->monitor);
- directory->details->monitor = NULL;
- }
- } else {
- if (file->details->monitor != NULL
- && !find_any_monitor (directory, file)) {
- nautilus_monitor_cancel (file->details->monitor);
- file->details->monitor = NULL;
- }
+ if (directory->details->monitor != NULL
+ && directory->details->monitor_list == NULL) {
+ nautilus_monitor_cancel (directory->details->monitor);
+ directory->details->monitor = NULL;
}
update_metadata_monitors (directory);
diff --git a/libnautilus-private/nautilus-file-private.h b/libnautilus-private/nautilus-file-private.h
index 7c28be9e1..24466f8ab 100644
--- a/libnautilus-private/nautilus-file-private.h
+++ b/libnautilus-private/nautilus-file-private.h
@@ -65,8 +65,6 @@ struct NautilusFileDetails
GnomeVFSFileInfo *info;
GnomeVFSResult get_info_error;
- NautilusMonitor *monitor;
-
guint directory_count;
guint deep_directory_count;
diff --git a/libnautilus-private/nautilus-file.c b/libnautilus-private/nautilus-file.c
index d7e68b26b..89a285b4b 100644
--- a/libnautilus-private/nautilus-file.c
+++ b/libnautilus-private/nautilus-file.c
@@ -471,10 +471,6 @@ finalize (GObject *object)
g_free (uri);
}
- if (file->details->monitor != NULL) {
- nautilus_monitor_cancel (file->details->monitor);
- }
-
nautilus_async_destroying_file (file);
remove_from_link_hash_table (file);