From: Timo Sirainen Date: Tue, 27 Oct 2009 04:22:25 +0000 (-0400) Subject: mailbox_notify_changes(): Delay sending notifications for 500 msecs. X-Git-Tag: 2.0.alpha3~93 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=56fb5d09955b6097f77b341717fd9b70e9f13e7a;p=thirdparty%2Fdovecot%2Fcore.git 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. --HG-- branch : HEAD --- diff --git a/src/lib-storage/index/index-mailbox-check.c b/src/lib-storage/index/index-mailbox-check.c index 4b4fa65d9e..624f3147e3 100644 --- a/src/lib-storage/index/index-mailbox-check.c +++ b/src/lib-storage/index/index-mailbox-check.c @@ -9,6 +9,8 @@ #include #include +#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); } diff --git a/src/lib-storage/index/index-storage.h b/src/lib-storage/index/index-storage.h index 54b23eeba9..471faa06e1 100644 --- a/src/lib-storage/index/index-storage.h +++ b/src/lib-storage/index/index-storage.h @@ -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; };