Mercurial > dovecot > core-2.2
changeset 21929:f778045077e6
lib-imap-client: Use struct timeval for tracking last_connect time.
This provides better accuracy when calculating how much time there's left
until reconnection.
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Mon, 10 Apr 2017 13:46:03 +0300 |
parents | d8719e363c86 |
children | 862bccc18e3d |
files | src/lib-imap-client/imapc-connection.c |
diffstat | 1 files changed, 9 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-imap-client/imapc-connection.c Mon Apr 10 13:02:17 2017 +0300 +++ b/src/lib-imap-client/imapc-connection.c Mon Apr 10 13:46:03 2017 +0300 @@ -97,7 +97,7 @@ enum imapc_input_state input_state; unsigned int cur_tag; uint32_t cur_num; - time_t last_connect; + struct timeval last_connect; unsigned int reconnect_count; struct imapc_client_mailbox *selecting_box, *selected_box; @@ -1803,25 +1803,28 @@ imapc_connection_input_reset(conn); + int msecs_since_last_connect = + timeval_diff_msecs(&ioloop_timeval, &conn->last_connect); if (!conn->reconnect_ok && - (time_t)(conn->last_connect + conn->client->set.connect_retry_interval_secs) >= ioloop_time) { + msecs_since_last_connect < (int)conn->client->set.connect_retry_interval_secs*1000) { if (conn->to != NULL) timeout_remove(&conn->to); conn->reconnecting = TRUE; imapc_connection_set_disconnected(conn); - /* don't wait longer than necessary, the +1 is to avoid ending here again */ + /* don't wait longer than necessary */ unsigned int delay_msecs = - ((conn->last_connect + conn->client->set.connect_retry_interval_secs) - ioloop_time + 1) * 1000; + conn->client->set.connect_retry_interval_secs*1000 - + msecs_since_last_connect; conn->to = timeout_add(delay_msecs, imapc_connection_reconnect, conn); return; } - conn->last_connect = ioloop_time; + conn->last_connect = ioloop_timeval; if (conn->client->set.debug) { i_debug("imapc(%s): Looking up IP address " "(reconnect_ok=%s, last_connect=%ld)", conn->name, (conn->reconnect_ok ? "true" : "false"), - (long)conn->last_connect); + (long)conn->last_connect.tv_sec); } i_zero(&dns_set);