Merge branch 'master' into gfio
[fio.git] / client.c
index 7b8dc61e4365aa4fd191d4ad0adf084b950ba037..9cbbcf66734877dd79d32fa284e2d7d3f4bb7a3d 100644 (file)
--- a/client.c
+++ b/client.c
@@ -55,6 +55,7 @@ struct group_run_stats client_gs;
 int sum_stat_clients;
 
 static int sum_stat_nr;
+static int do_output_all_clients;
 
 #define FIO_CLIENT_HASH_BITS   7
 #define FIO_CLIENT_HASH_SZ     (1 << FIO_CLIENT_HASH_BITS)
@@ -116,6 +117,9 @@ void fio_put_client(struct fio_client *client)
        if (client->ini_file)
                free(client->ini_file);
 
+       if (!client->did_stat)
+               sum_stat_clients -= client->nr_stat;
+
        free(client);
 }
 
@@ -142,8 +146,6 @@ static void remove_client(struct fio_client *client)
                client->ops->removed(client);
 
        nr_clients--;
-       sum_stat_clients--;
-
        fio_put_client(client);
 }
 
@@ -776,8 +778,9 @@ static void handle_ts(struct fio_client *client, struct fio_net_cmd *cmd)
        struct cmd_ts_pdu *p = (struct cmd_ts_pdu *) cmd->payload;
 
        show_thread_status(&p->ts, &p->rs);
+       client->did_stat = 1;
 
-       if (sum_stat_clients == 1)
+       if (!do_output_all_clients)
                return;
 
        sum_thread_stats(&client_ts, &p->ts, sum_stat_nr);
@@ -1016,7 +1019,13 @@ static void handle_start(struct fio_client *client, struct fio_net_cmd *cmd)
        struct cmd_start_pdu *pdu = (struct cmd_start_pdu *) cmd->payload;
 
        client->state = Client_started;
-       client->jobs = pdu->jobs;
+       client->jobs = le32_to_cpu(pdu->jobs);
+       client->nr_stat = le32_to_cpu(pdu->stat_outputs);
+
+       if (sum_stat_clients > 1)
+               do_output_all_clients = 1;
+
+       sum_stat_clients += client->nr_stat;
 }
 
 static void handle_stop(struct fio_client *client, struct fio_net_cmd *cmd)
@@ -1345,7 +1354,6 @@ int fio_handle_clients(struct client_ops *ops)
 
        pfds = malloc(nr_clients * sizeof(struct pollfd));
 
-       sum_stat_clients = nr_clients;
        init_thread_stat(&client_ts);
        init_group_run_stat(&client_gs);