nautilus r14847 - in trunk: . libnautilus-private



Author: alexl
Date: Tue Jan 13 10:56:53 2009
New Revision: 14847
URL: http://svn.gnome.org/viewvc/nautilus?rev=14847&view=rev

Log:
2009-01-13  Alexander Larsson  <alexl redhat com>

        * libnautilus-private/nautilus-directory-async.c:
        * libnautilus-private/nautilus-directory-private.h:
	Count all outstanding monitor and call_when_ready details



Modified:
   trunk/ChangeLog
   trunk/libnautilus-private/nautilus-directory-async.c
   trunk/libnautilus-private/nautilus-directory-private.h

Modified: trunk/libnautilus-private/nautilus-directory-async.c
==============================================================================
--- trunk/libnautilus-private/nautilus-directory-async.c	(original)
+++ trunk/libnautilus-private/nautilus-directory-async.c	Tue Jan 13 10:56:53 2009
@@ -278,6 +278,32 @@
 	g_hash_table_destroy (table);
 }
 
+static void
+request_counter_add_request (RequestCounter counter,
+			     Request request)
+{
+	guint i;
+
+	for (i = 0; i < REQUEST_TYPE_LAST; i++) {
+		if (REQUEST_WANTS_TYPE (request, i)) {
+			counter[i]++;
+		}
+	}
+}
+
+static void
+request_counter_remove_request (RequestCounter counter,
+				Request request)
+{
+	guint i;
+
+	for (i = 0; i < REQUEST_TYPE_LAST; i++) {
+		if (REQUEST_WANTS_TYPE (request, i)) {
+			counter[i]++;
+		}
+	}
+}
+
 /* Start a job. This is really just a way of limiting the number of
  * async. requests that we issue at any given time. Without this, the
  * number of requests is unbounded.
@@ -578,10 +604,15 @@
 remove_monitor_link (NautilusDirectory *directory,
 		     GList *link)
 {
+	Monitor *monitor;
+	
 	if (link != NULL) {
+		monitor = link->data;
+		request_counter_remove_request (directory->details->monitor_counters,
+						monitor->request);
 		directory->details->monitor_list =
 			g_list_remove_link (directory->details->monitor_list, link);
-		g_free (link->data);
+		g_free (monitor);
 		g_list_free_1 (link);
 	}
 }
@@ -703,6 +734,8 @@
 	}
 	directory->details->monitor_list =
 		g_list_prepend (directory->details->monitor_list, monitor);
+	request_counter_add_request (directory->details->monitor_counters,
+				     monitor->request);
 
 	if (callback != NULL) {
 		file_list = nautilus_directory_get_file_list (directory);
@@ -1347,6 +1380,8 @@
 	directory->details->call_when_ready_list = g_list_prepend
 		(directory->details->call_when_ready_list,
 		 g_memdup (&callback, sizeof (callback)));
+	request_counter_add_request (directory->details->call_when_ready_counters,
+				     callback.request);
 
 	/* When we change the ready list we need to sync up metadata monitors.
 	 * We could just call update_metadata_monitors here, but we can be smarter
@@ -1384,8 +1419,15 @@
 remove_callback_link_keep_data (NautilusDirectory *directory,
 				GList *link)
 {
+	ReadyCallback *callback;
+
+	callback = link->data;
+	
 	directory->details->call_when_ready_list = g_list_remove_link
 		(directory->details->call_when_ready_list, link);
+	
+	request_counter_remove_request (directory->details->call_when_ready_counters,
+					callback->request);
 	g_list_free_1 (link);
 }
 
@@ -1393,8 +1435,11 @@
 remove_callback_link (NautilusDirectory *directory,
 		      GList *link)
 {
-	g_free (link->data);
+	ReadyCallback *callback;
+	
+	callback = link->data;
 	remove_callback_link_keep_data (directory, link);
+	g_free (callback);
 }
 
 void

Modified: trunk/libnautilus-private/nautilus-directory-private.h
==============================================================================
--- trunk/libnautilus-private/nautilus-directory-private.h	(original)
+++ trunk/libnautilus-private/nautilus-directory-private.h	Tue Jan 13 10:56:53 2009
@@ -46,6 +46,30 @@
 typedef struct MountState MountState;
 typedef struct FilesystemInfoState FilesystemInfoState;
 
+typedef enum {
+	REQUEST_LINK_INFO,
+	REQUEST_DEEP_COUNT,
+	REQUEST_DIRECTORY_COUNT,
+	REQUEST_FILE_INFO,
+	REQUEST_FILE_LIST, /* always FALSE if file != NULL */
+	REQUEST_METAFILE,
+	REQUEST_MIME_LIST,
+	REQUEST_TOP_LEFT_TEXT,
+	REQUEST_LARGE_TOP_LEFT_TEXT,
+	REQUEST_EXTENSION_INFO,
+	REQUEST_THUMBNAIL,
+	REQUEST_MOUNT,
+	REQUEST_FILESYSTEM_INFO,
+	REQUEST_TYPE_LAST
+} RequestType;
+
+/* A request for information about one or more files. */
+typedef guint32 Request;
+typedef guint32 RequestCounter[REQUEST_TYPE_LAST];
+
+#define REQUEST_WANTS_TYPE(request, type) (request && (1<<type))
+#define REQUEST_SET_TYPE(request, type) request |= (1<<type)
+
 struct NautilusDirectoryDetails
 {
 	/* The location. */
@@ -65,7 +89,9 @@
 	 * are going to get big, we can use hash tables instead.
 	 */
 	GList *call_when_ready_list;
+	RequestCounter call_when_ready_counters;
 	GList *monitor_list;
+	RequestCounter monitor_counters;
 	guint call_ready_idle_id;
 
 	NautilusMonitor *monitor;
@@ -119,29 +145,6 @@
 	GHashTable *hidden_file_hash;
 };
 
-typedef enum {
-	REQUEST_LINK_INFO,
-	REQUEST_DEEP_COUNT,
-	REQUEST_DIRECTORY_COUNT,
-	REQUEST_FILE_INFO,
-	REQUEST_FILE_LIST, /* always FALSE if file != NULL */
-	REQUEST_METAFILE,
-	REQUEST_MIME_LIST,
-	REQUEST_TOP_LEFT_TEXT,
-	REQUEST_LARGE_TOP_LEFT_TEXT,
-	REQUEST_EXTENSION_INFO,
-	REQUEST_THUMBNAIL,
-	REQUEST_MOUNT,
-	REQUEST_FILESYSTEM_INFO,
-	REQUEST_TYPE_LAST
-} RequestType;
-
-/* A request for information about one or more files. */
-typedef guint32 Request;
-
-#define REQUEST_WANTS_TYPE(request, type) (request && (1<<type))
-#define REQUEST_SET_TYPE(request, type) request |= (1<<type)
-
 NautilusDirectory *nautilus_directory_get_existing                    (GFile                     *location);
 
 /* async. interface */



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