struct timeout *to_throttle, *to_throttle_shrink;
bool reconnecting:1;
+ bool reconnect_waiting:1;
bool reconnect_ok:1;
bool idling:1;
bool idle_stopping:1;
static void imapc_connection_reconnect(struct imapc_connection *conn)
{
conn->reconnect_ok = FALSE;
+ conn->reconnect_waiting = FALSE;
if (conn->selected_box != NULL)
imapc_client_mailbox_reconnect(conn->selected_box);
imapc_connection_disconnect_full(conn, TRUE);
conn->to = timeout_add(delay_msecs, imapc_connection_reconnect, conn);
conn->reconnect_count++;
+ conn->reconnect_waiting = TRUE;
}
}
}
if (conn->fd != -1 || conn->dns_lookup != NULL)
return;
+ if (conn->reconnect_waiting) {
+ /* wait for the reconnection delay to finish before
+ doing anything. */
+ return;
+ }
+
conn->reconnecting = FALSE;
/* if we get disconnected before we've finished all the pending
commands, don't reconnect */
array_count(&conn->cmd_send_queue);
imapc_connection_input_reset(conn);
-
- int msecs_since_last_connect =
- timeval_diff_msecs(&ioloop_timeval, &conn->last_connect);
- if (!conn->reconnect_ok &&
- msecs_since_last_connect < (int)conn->client->set.connect_retry_interval_msecs) {
- if (conn->to != NULL)
- timeout_remove(&conn->to);
- conn->reconnecting = TRUE;
- imapc_connection_set_disconnected(conn);
- /* don't wait longer than necessary */
- unsigned int delay_msecs =
- conn->client->set.connect_retry_interval_msecs -
- msecs_since_last_connect;
- conn->to = timeout_add(delay_msecs, imapc_connection_reconnect, conn);
- return;
- }
conn->last_connect = ioloop_timeval;
if (conn->client->set.debug) {