From: Stephan Bosch Date: Sun, 18 Dec 2016 17:41:37 +0000 (+0100) Subject: lib-http: client: peer: Moved http_client_peer_disconnect() function. X-Git-Tag: 2.3.0.rc1~261 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4e629672bcb3c85e240b0f43369cdde3b5ce400b;p=thirdparty%2Fdovecot%2Fcore.git lib-http: client: peer: Moved http_client_peer_disconnect() function. This is a preparation for a subsequent change. --- diff --git a/src/lib-http/http-client-peer.c b/src/lib-http/http-client-peer.c index dc25d06680..ec5789b792 100644 --- a/src/lib-http/http-client-peer.c +++ b/src/lib-http/http-client-peer.c @@ -261,6 +261,43 @@ http_client_peer_create(struct http_client *client, return peer; } +static void +http_client_peer_disconnect(struct http_client_peer *peer) +{ + struct http_client_connection **conn; + ARRAY_TYPE(http_client_connection) conns; + struct http_client_queue *const *queue; + + if (peer->disconnected) + return; + peer->disconnected = TRUE; + + http_client_peer_debug(peer, "Peer disconnect"); + + /* make a copy of the connection array; freed connections modify it */ + t_array_init(&conns, array_count(&peer->conns)); + array_copy(&conns.arr, 0, &peer->conns.arr, 0, array_count(&peer->conns)); + array_foreach_modifiable(&conns, conn) { + http_client_connection_peer_closed(conn); + } + i_assert(array_count(&peer->conns) == 0); + + if (peer->to_req_handling != NULL) + timeout_remove(&peer->to_req_handling); + 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); +} + static void http_client_peer_do_connect(struct http_client_peer *peer, unsigned int count) @@ -691,43 +728,6 @@ void http_client_peer_trigger_request_handler(struct http_client_peer *peer) } } -static void -http_client_peer_disconnect(struct http_client_peer *peer) -{ - struct http_client_connection **conn; - ARRAY_TYPE(http_client_connection) conns; - struct http_client_queue *const *queue; - - if (peer->disconnected) - return; - peer->disconnected = TRUE; - - http_client_peer_debug(peer, "Peer disconnect"); - - /* make a copy of the connection array; freed connections modify it */ - t_array_init(&conns, array_count(&peer->conns)); - array_copy(&conns.arr, 0, &peer->conns.arr, 0, array_count(&peer->conns)); - array_foreach_modifiable(&conns, conn) { - http_client_connection_peer_closed(conn); - } - i_assert(array_count(&peer->conns) == 0); - - if (peer->to_req_handling != NULL) - timeout_remove(&peer->to_req_handling); - 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) { peer->refcount++;