changeset 9452:abbb153d4643 HEAD

mailbox_notify_changes(): Delay sending notifications for 500 msecs. If the notification is done immediately, IDLE may not notice the change because it's not finished yet.
author Timo Sirainen <tss@iki.fi>
date Tue, 27 Oct 2009 00:21:53 -0400
parents 9fff30644260
children ead94beba32a
files src/lib-storage/index/index-mailbox-check.c src/lib-storage/index/index-storage.h
diffstat 2 files changed, 18 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/index/index-mailbox-check.c	Mon Oct 26 17:06:57 2009 -0400
+++ b/src/lib-storage/index/index-mailbox-check.c	Tue Oct 27 00:21:53 2009 -0400
@@ -9,6 +9,8 @@
 #include <fcntl.h>
 #include <sys/stat.h>
 
+#define NOTIFY_DELAY_MSECS 500
+
 struct index_notify_file {
 	struct index_notify_file *next;
 
@@ -25,9 +27,8 @@
 {
 	struct index_notify_file *file;
 	struct stat st;
-	bool notify;
+	bool notify = FALSE;
 
-	notify = ibox->notify_pending;
 	for (file = ibox->notify_files; file != NULL; file = file->next) {
 		if (stat(file->path, &st) == 0 &&
 		    file->last_stamp != st.st_mtime) {
@@ -37,23 +38,25 @@
 	}
 
 	if (notify) {
-		ibox->notify_last_sent = ioloop_time;
-		ibox->notify_pending = FALSE;
+		if (ibox->notify_delay_to != NULL)
+			timeout_remove(&ibox->notify_delay_to);
 		ibox->box.notify_callback(&ibox->box, ibox->box.notify_context);
 	}
 }
 
+static void notify_delay_callback(struct index_mailbox *ibox)
+{
+	ibox->box.notify_callback(&ibox->box, ibox->box.notify_context);
+}
+
 static void notify_callback(struct index_mailbox *ibox)
 {
 	timeout_reset(ibox->notify_to);
 
-	/* don't notify more often than once a second */
-	if (ioloop_time > ibox->notify_last_sent) {
-		ibox->notify_last_sent = ioloop_time;
-                ibox->notify_pending = FALSE;
-		ibox->box.notify_callback(&ibox->box, ibox->box.notify_context);
-	} else {
-		ibox->notify_pending = TRUE;
+	if (ibox->notify_delay_to == NULL) {
+		ibox->notify_delay_to =
+			timeout_add(NOTIFY_DELAY_MSECS,
+				    notify_delay_callback, ibox);
 	}
 }
 
@@ -95,9 +98,6 @@
 	struct index_notify_file *file;
 	struct index_notify_io *aio;
 
-	/* reset notify stamp */
-	ibox->notify_last_sent = 0;
-
 	while (ibox->notify_files != NULL) {
 		file = ibox->notify_files;
 		ibox->notify_files = file->next;
@@ -114,6 +114,8 @@
 		i_free(aio);
 	}
 
+	if (ibox->notify_delay_to != NULL)
+		timeout_remove(&ibox->notify_delay_to);
 	if (ibox->notify_to != NULL)
 		timeout_remove(&ibox->notify_to);
 }
--- a/src/lib-storage/index/index-storage.h	Mon Oct 26 17:06:57 2009 -0400
+++ b/src/lib-storage/index/index-storage.h	Tue Oct 27 00:21:53 2009 -0400
@@ -36,10 +36,10 @@
 
 	uint32_t md5hdr_ext_idx;
 
-	struct timeout *notify_to;
+	struct timeout *notify_to, *notify_delay_to;
 	struct index_notify_file *notify_files;
         struct index_notify_io *notify_ios;
-	time_t notify_last_check, notify_last_sent;
+	time_t notify_last_check;
 
 	time_t next_lock_notify; /* temporary */
 	enum mailbox_lock_notify_type last_notify_type;
@@ -63,7 +63,6 @@
 	unsigned int keep_locked:1;
 	unsigned int sent_diskspace_warning:1;
 	unsigned int sent_readonly_flags_warning:1;
-	unsigned int notify_pending:1;
 	unsigned int move_to_memory:1;
 	unsigned int fsync_disable:1;
 };