From: Stephan Bosch Date: Wed, 12 Aug 2020 17:54:50 +0000 (+0200) Subject: lib-http: http-client-connection - Use separate flag for idle status. X-Git-Tag: 2.3.13~275 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=dda4e8d8a56b2c6e43d31dab6f9564c8c9bdde47;p=thirdparty%2Fdovecot%2Fcore.git lib-http: http-client-connection - Use separate flag for idle status. It used the presence of the idle timeout before, which isn't acceptable when the timeout is changed to be optional (happens in later commit). --- diff --git a/src/lib-http/http-client-connection.c b/src/lib-http/http-client-connection.c index 160cf9f109..2740a05bb7 100644 --- a/src/lib-http/http-client-connection.c +++ b/src/lib-http/http-client-connection.c @@ -110,7 +110,7 @@ http_client_connection_count_pending(struct http_client_connection *conn) bool http_client_connection_is_idle(struct http_client_connection *conn) { - return (conn->to_idle != NULL); + return conn->idle; } bool http_client_connection_is_active(struct http_client_connection *conn) @@ -436,9 +436,11 @@ void http_client_connection_lost_peer(struct http_client_connection *conn) i_assert(!conn->in_req_callback); - if (conn->to_idle == NULL) { + if (!conn->idle) { unsigned int timeout, count, max; + i_assert(conn->to_idle == NULL); + count = array_count(&ppool->conns); i_assert(count > 0); max = http_client_peer_shared_max_connections(pshared); @@ -465,6 +467,8 @@ void http_client_connection_lost_peer(struct http_client_connection *conn) conn->to_idle = timeout_add_to( conn->conn.ioloop, timeout, http_client_connection_idle_timeout, conn); + + conn->idle = TRUE; array_push_back(&ppool->idle_conns, &conn); } else { e_debug(conn->event, "Lost peer; already idle"); @@ -483,14 +487,15 @@ void http_client_connection_check_idle(struct http_client_connection *conn) peer = conn->peer; if (peer == NULL) { - i_assert(conn->to_idle != NULL); + i_assert(conn->idle); return; } - if (conn->to_idle != NULL) { - /* Timeout already set */ + if (conn->idle) { + /* Already idle */ return; } + i_assert(conn->to_idle == NULL); client = peer->client; set = &client->set; @@ -536,6 +541,8 @@ void http_client_connection_check_idle(struct http_client_connection *conn) conn->to_idle = timeout_add_to( conn->conn.ioloop, timeout, http_client_connection_idle_timeout, conn); + + conn->idle = TRUE; array_push_back(&ppool->idle_conns, &conn); } } @@ -546,8 +553,8 @@ http_client_connection_stop_idle(struct http_client_connection *conn) struct http_client_connection *const *conn_idx; ARRAY_TYPE(http_client_connection) *conn_arr; - if (conn->to_idle != NULL) - timeout_remove(&conn->to_idle); + timeout_remove(&conn->to_idle); + conn->idle = FALSE; conn_arr = &conn->ppool->idle_conns; array_foreach(conn_arr, conn_idx) { diff --git a/src/lib-http/http-client-private.h b/src/lib-http/http-client-private.h index d6c854e14e..ccc41ed91a 100644 --- a/src/lib-http/http-client-private.h +++ b/src/lib-http/http-client-private.h @@ -194,6 +194,7 @@ struct http_client_connection { ARRAY_TYPE(http_client_request) request_wait_list; bool connected:1; /* Connection is connected */ + bool idle:1; /* Connection is idle */ bool tunneling:1; /* Last sent request turns this connection into tunnel */ bool connect_succeeded:1; /* Connection succeeded including SSL */