]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
mailbox_notify_changes(): Delay sending notifications for 500 msecs.
authorTimo Sirainen <tss@iki.fi>
Tue, 27 Oct 2009 04:22:25 +0000 (00:22 -0400)
committerTimo Sirainen <tss@iki.fi>
Tue, 27 Oct 2009 04:22:25 +0000 (00:22 -0400)
If the notification is done immediately, IDLE may not notice the change
because it's not finished yet.

--HG--
branch : HEAD

src/lib-storage/index/index-mailbox-check.c
src/lib-storage/index/index-storage.h

index 4b4fa65d9e8adf847278463fd908defa890dfa4e..624f3147e38e84feb2f915dbf69191883e76cfc4 100644 (file)
@@ -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 @@ static void check_timeout(struct index_mailbox *ibox)
 {
        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 @@ static void check_timeout(struct index_mailbox *ibox)
        }
 
        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 @@ void index_mailbox_check_remove_all(struct index_mailbox *ibox)
        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 @@ void index_mailbox_check_remove_all(struct index_mailbox *ibox)
                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);
 }
index 54b23eeba98dabd2be31fb6ec9492fc39290b61d..471faa06e1eeec0e41fa35d51c272c397e0743d5 100644 (file)
@@ -43,10 +43,10 @@ struct index_mailbox {
        struct mail_cache *cache;
        struct mail_vfuncs *mail_vfuncs;
 
-       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;
@@ -62,7 +62,6 @@ struct index_mailbox {
 
        /* we've discovered there aren't enough permissions to modify mailbox */
        unsigned int backend_readonly:1;
-       unsigned int notify_pending:1;
        unsigned int move_to_memory:1;
 };