Skip to content

Commit

Permalink
mailbox_notify_changes(): Delay sending notifications for 500 msecs.
Browse files Browse the repository at this point in the history
If the notification is done immediately, IDLE may not notice the change
because it's not finished yet.

--HG--
branch : HEAD
  • Loading branch information
sirainen committed Oct 27, 2009
1 parent 83fa91a commit 56fb5d0
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 17 deletions.
30 changes: 16 additions & 14 deletions src/lib-storage/index/index-mailbox-check.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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) {
Expand All @@ -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);
}
}

Expand Down Expand Up @@ -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;
Expand All @@ -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);
}
5 changes: 2 additions & 3 deletions src/lib-storage/index/index-storage.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
};

Expand Down

0 comments on commit 56fb5d0

Please sign in to comment.