[gamin] new inotify 0.23 patch



Attached is the latest inotify 0.23 gamin patch. Test reports are
appreciated.

-- 
John McCutchan <ttb tentacle dhs org>
Index: server/gam_inotify.c
===================================================================
RCS file: /cvs/gnome/gamin/server/gam_inotify.c,v
retrieving revision 1.18
diff -u -r1.18 gam_inotify.c
--- server/gam_inotify.c	15 Apr 2005 11:17:38 -0000	1.18
+++ server/gam_inotify.c	30 Apr 2005 20:13:14 -0000
@@ -52,14 +52,11 @@
     int refcount;
     GList *subs;
     int busy;
-
-    gboolean dirty;
-    GTimer *poll_timer;
+	gboolean deactivated;
 } inotify_data_t;
 
 static GHashTable *path_hash = NULL;
 static GHashTable *wd_hash = NULL;
-static GList *dirty_list = NULL;
 
 G_LOCK_DEFINE_STATIC(inotify);
 
@@ -149,8 +146,6 @@
     data->wd = wd;
     data->busy = 0;
     data->refcount = 1;
-    data->dirty = FALSE;
-    data->poll_timer = g_timer_new ();
 
     return data;
 }
@@ -161,7 +156,6 @@
     if (data->refcount != 0)
 	GAM_DEBUG(DEBUG_INFO, "gam_inotify_data_free called with reffed data.\n");
     g_free(data->path);
-    g_timer_destroy (data->poll_timer);
     g_free(data);
 }
 
@@ -301,8 +295,7 @@
 		    if (ioctl (inotify_device_fd, INOTIFY_IGNORE, &data->wd) < 0) {
 			GAM_DEBUG (DEBUG_INFO, "INOTIFY_IGNORE failed for %s (wd = %d)\n", data->path, data->wd);
 		    }
-		    g_hash_table_remove(wd_hash, GINT_TO_POINTER(data->wd));
-		    data->wd = -1;
+		    data->deactivated = TRUE;
 		    GAM_DEBUG(DEBUG_INFO, "deactivated inotify for %s\n",
 			      data->path);
 #ifdef GAMIN_DEBUG_API
@@ -331,8 +324,13 @@
 			path_wd = ioctl (inotify_device_fd, INOTIFY_WATCH, &iwr);
 			close (path_fd);
 
+			/* Remove the old wd from the hash table */
+		    g_hash_table_remove(wd_hash, GINT_TO_POINTER(data->wd));
+
 			data->wd = path_wd;
+			data->deactivated = FALSE;
 
+			/* Insert the new wd into the hash table */
 			g_hash_table_insert(wd_hash, GINT_TO_POINTER(data->wd),
 			                    data);
 			GAM_DEBUG(DEBUG_INFO, "Reactivated inotify for %s\n",
@@ -389,34 +387,6 @@
     }
 }
 
-/* Must be called with inotify lock locked */
-static void
-gam_inotify_dirty_list_cleaner ()
-{
-    GList *l;
-
-    /* Here we walk the old dirty list and create a new one. 
-     * if we don't poll a node on the old list, we add it to the new one */
-
-    l = dirty_list;
-    dirty_list = NULL;
-
-    for (l = l; l; l = l->next) {
-	inotify_data_t *data = l->data;
-
-	g_assert (data->dirty);
-
-	if (g_timer_elapsed (data->poll_timer, NULL) >= MIN_POLL_TIME) {
-	    data->dirty = FALSE;
-	    gam_poll_scan_directory (data->path);
-	} else {
-	    dirty_list = g_list_append (dirty_list, data);
-	}
-    }
-
-    g_list_free (l);
-}
-
 static gboolean
 gam_inotify_read_handler(gpointer user_data)
 {
@@ -460,9 +430,11 @@
 	if (!data) {
 	    GAM_DEBUG(DEBUG_INFO, "inotify can't find wd %d\n", event->wd);
 	} else {
-	    if (event->mask == IN_IGNORED || event->mask == IN_UNMOUNT) {
+	    if (event->mask == IN_IGNORED) {
 		GList *l;
 
+		GAM_DEBUG(DEBUG_INFO, "inotify ignoring wd %d\n", event->wd);
+
 		l = data->subs;
 		data->subs = NULL;
 		for (l = l; l; l = l->next) {
@@ -475,16 +447,9 @@
 		    GAM_DEBUG(DEBUG_INFO, "poll was requested for event = ");
 		    print_mask (event->mask);
 		    gam_poll_scan_directory (data->path);
-#if 0
-		    /* if node isn't dirty */
-		    if (!data->dirty) {
-			/* Put this node on the dirty list */
-			data->dirty = TRUE;
-			g_timer_start(data->poll_timer);
-			dirty_list = g_list_append (dirty_list, data);
-		    }
-#endif
 		}
+	    } else if (event->mask == IN_Q_OVERFLOW) {
+		GAM_DEBUG(DEBUG_INFO, "inotify queue over flowed\n");
 	    }
 	}
 
Index: server/local_inotify.h
===================================================================
RCS file: /cvs/gnome/gamin/server/local_inotify.h,v
retrieving revision 1.6
diff -u -r1.6 local_inotify.h
--- server/local_inotify.h	16 Mar 2005 22:04:15 -0000	1.6
+++ server/local_inotify.h	30 Apr 2005 20:13:14 -0000
@@ -8,7 +8,6 @@
 #define _LINUX_INOTIFY_H
 
 #include <linux/types.h>
-#include <linux/limits.h>
 
 /*
  * struct inotify_event - structure read from the inotify device for each event
@@ -20,7 +19,7 @@
 	__s32		wd;		/* watch descriptor */
 	__u32		mask;		/* watch mask */
 	__u32		cookie;		/* cookie to synchronize two events */
-	size_t		len;		/* length (including nulls) of name */
+	__u32		len;		/* length (including nulls) of name */
 	char		name[0];	/* stub for possible name */
 };
 
@@ -34,27 +33,42 @@
 	__u32		mask;		/* event mask */
 };
 
-/* the following are legal, implemented events */
+/* the following are legal, implemented events that user-space can watch for */
 #define IN_ACCESS		0x00000001	/* File was accessed */
 #define IN_MODIFY		0x00000002	/* File was modified */
-#define IN_ATTRIB		0x00000004	/* File changed attributes */
+#define IN_ATTRIB		0x00000004	/* Metadata changed */
 #define IN_CLOSE_WRITE		0x00000008	/* Writtable file was closed */
 #define IN_CLOSE_NOWRITE	0x00000010	/* Unwrittable file closed */
 #define IN_OPEN			0x00000020	/* File was opened */
 #define IN_MOVED_FROM		0x00000040	/* File was moved from X */
 #define IN_MOVED_TO		0x00000080	/* File was moved to Y */
-#define IN_DELETE_SUBDIR	0x00000100	/* Subdir was deleted */ 
+#define IN_DELETE_SUBDIR	0x00000100	/* Subdir was deleted */
 #define IN_DELETE_FILE		0x00000200	/* Subfile was deleted */
 #define IN_CREATE_SUBDIR	0x00000400	/* Subdir was created */
 #define IN_CREATE_FILE		0x00000800	/* Subfile was created */
 #define IN_DELETE_SELF		0x00001000	/* Self was deleted */
+
+/* the following are legal events.  they are sent as needed to any watch */
 #define IN_UNMOUNT		0x00002000	/* Backing fs was unmounted */
 #define IN_Q_OVERFLOW		0x00004000	/* Event queued overflowed */
 #define IN_IGNORED		0x00008000	/* File was ignored */
 
+/* helper events */
+#define IN_CLOSE		(IN_CLOSE_WRITE | IN_CLOSE_NOWRITE) /* close */
+#define IN_MOVE			(IN_MOVED_FROM | IN_MOVED_TO) /* moves */
+
 /* special flags */
-#define IN_ALL_EVENTS		0xffffffff	/* All the events */
-#define IN_CLOSE		(IN_CLOSE_WRITE | IN_CLOSE_NOWRITE)
+#define IN_ONESHOT		0x80000000	/* only send event once */
+
+/*
+ * All of the events - we build the list by hand so that we can add flags in
+ * the future and not break backward compatibility.  Apps will get only the
+ * events that they originally wanted.  Be sure to add new events here!
+ */
+#define IN_ALL_EVENTS	(IN_ACCESS | IN_MODIFY | IN_ATTRIB | IN_CLOSE_WRITE | \
+			 IN_CLOSE_NOWRITE | IN_OPEN | IN_MOVED_FROM | \
+			 IN_MOVED_TO | IN_DELETE_SUBDIR | IN_DELETE_FILE | \
+			 IN_CREATE_SUBDIR | IN_CREATE_FILE | IN_DELETE_SELF)
 
 #define INOTIFY_IOCTL_MAGIC	'Q'
 #define INOTIFY_IOCTL_MAXNR	2
@@ -67,7 +81,6 @@
 #include <linux/dcache.h>
 #include <linux/fs.h>
 #include <linux/config.h>
-#include <asm/atomic.h>
 
 #ifdef CONFIG_INOTIFY
 
@@ -75,7 +88,7 @@
 				      const char *);
 extern void inotify_dentry_parent_queue_event(struct dentry *, __u32, __u32,
 					      const char *);
-extern void inotify_super_block_umount(struct super_block *);
+extern void inotify_unmount_inodes(struct list_head *);
 extern void inotify_inode_is_dead(struct inode *);
 extern u32 inotify_get_cookie(void);
 
@@ -93,7 +106,7 @@
 {
 }
 
-static inline void inotify_super_block_umount(struct super_block *sb)
+static inline void inotify_unmount_inodes(struct list_head *list)
 {
 }
 


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