]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
doveadm: Fixed hanging when printing output from different server connections.
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Mon, 8 Aug 2016 16:24:08 +0000 (19:24 +0300)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Mon, 8 Aug 2016 16:24:08 +0000 (19:24 +0300)
src/doveadm/server-connection.c

index cff4ceabbc8f8b453ceb33740ac0aa5b27e860aa..e7ab99e31a22a8a37fd47d13033be23ad13c1b43 100644 (file)
@@ -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;
        }