{
struct http_client_connection **conn;
ARRAY_TYPE(http_client_connection) conns;
+ struct http_client_queue *const *queue;
if (peer->disconnected)
return;
if (peer->to_backoff != NULL)
timeout_remove(&peer->to_backoff);
+ /* unlist in client */
hash_table_remove
(peer->client->peers, (const struct http_client_peer_addr *)&peer->addr);
DLLIST_REMOVE(&peer->client->peers_list, peer);
+
+ /* unlink all queues */
+ array_foreach(&peer->queues, queue)
+ http_client_queue_peer_disconnected(*queue, peer);
+ array_clear(&peer->queues);
}
void http_client_peer_ref(struct http_client_peer *peer)
http_client_peer_disconnect(peer);
+ i_assert(array_count(&peer->queues) == 0);
+
array_free(&peer->conns);
array_free(&peer->queues);
i_free(peer->addr_name);
const struct http_client_peer_addr *addr);
void http_client_queue_connection_failure(struct http_client_queue *queue,
const struct http_client_peer_addr *addr, const char *reason);
+void http_client_queue_peer_disconnected(struct http_client_queue *queue,
+ struct http_client_peer *peer);
void http_client_queue_switch_ioloop(struct http_client_queue *queue);
struct http_client_host *
return;
}
+void
+http_client_queue_peer_disconnected(struct http_client_queue *queue,
+ struct http_client_peer *peer)
+{
+ struct http_client_peer *const *peer_idx;
+
+ if (!array_is_created(&queue->pending_peers))
+ return;
+
+ array_foreach(&queue->pending_peers, peer_idx) {
+ if (*peer_idx == peer) {
+ array_delete(&queue->pending_peers,
+ array_foreach_idx(&queue->pending_peers, peer_idx), 1);
+ break;
+ }
+ }
+}
+
/*
* Main request queue
*/