From: Timo Sirainen Date: Mon, 8 Aug 2016 16:24:08 +0000 (+0300) Subject: doveadm: Fixed hanging when printing output from different server connections. X-Git-Tag: 2.3.0.rc1~3209 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=4e7bbab858a56397bcf95bf5941edf98954e034f;p=thirdparty%2Fdovecot%2Fcore.git doveadm: Fixed hanging when printing output from different server connections. --- diff --git a/src/doveadm/server-connection.c b/src/doveadm/server-connection.c index cff4ceabbc..e7ab99e31a 100644 --- a/src/doveadm/server-connection.c +++ b/src/doveadm/server-connection.c @@ -58,18 +58,29 @@ struct server_connection { }; static struct server_connection *printing_conn = NULL; +static ARRAY(struct doveadm_server *) print_pending_servers = ARRAY_INIT; static void server_connection_input(struct server_connection *conn); static bool server_connection_input_one(struct server_connection *conn); -static void print_connection_released(void) +static void server_set_print_pending(struct doveadm_server *server) +{ + struct doveadm_server *const *serverp; + + if (!array_is_created(&print_pending_servers)) + i_array_init(&print_pending_servers, 16); + array_foreach(&print_pending_servers, serverp) { + if (*serverp == server) + return; + } + array_append(&print_pending_servers, &server, 1); +} + +static void server_print_connection_released(struct doveadm_server *server) { - struct doveadm_server *server = printing_conn->server; struct server_connection *const *conns; unsigned int i, count; - printing_conn = NULL; - conns = array_get(&server->connections, &count); for (i = 0; i < count; i++) { if (conns[i]->io != NULL) @@ -82,6 +93,19 @@ static void print_connection_released(void) } } +static void print_connection_released(void) +{ + struct doveadm_server *const *serverp; + + printing_conn = NULL; + if (!array_is_created(&print_pending_servers)) + return; + + array_foreach(&print_pending_servers, serverp) + server_print_connection_released(*serverp); + array_free(&print_pending_servers); +} + static int server_connection_send_cmd_input_more(struct server_connection *conn) { enum ostream_send_istream_result res; @@ -192,6 +216,7 @@ server_handle_input(struct server_connection *conn, } else { /* someone else is printing. don't continue until it goes away */ + server_set_print_pending(conn->server); io_remove(&conn->io); return; }