Mercurial > dovecot > original-hg > dovecot-1.2
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; };