int fd;
int state;
+ int skip_newline;
uint16_t argc;
char **argv;
};
enum {
+ Client_created = 0,
Client_connected = 1,
Client_started = 2,
Client_stopped = 3,
+ Client_exited = 4,
};
static FLIST_HEAD(client_list);
struct flist_head *entry;
struct fio_client *client;
+ dprint(FD_NET, "client: terminate clients\n");
+
flist_for_each(entry, &client_list) {
client = flist_entry(entry, struct fio_client, list);
static void sig_int(int sig)
{
+ dprint(FD_NET, "client: got sign %d\n", sig);
fio_clients_terminate();
}
static void probe_client(struct fio_client *client)
{
+ dprint(FD_NET, "client: send probe\n");
+
fio_net_send_simple_cmd(client->fd, FIO_NET_CMD_PROBE, 0);
handle_client(client, 1);
}
struct cmd_line_pdu *pdu;
int i, ret;
+ dprint(FD_NET, "client: send cmdline\n");
+
pdu = malloc(sizeof(*pdu));
for (i = 0; i < client->argc; i++)
strcpy((char *) pdu->argv[i], client->argv[i]);
struct flist_head *entry, *tmp;
int ret;
+ dprint(FD_NET, "client: connect all\n");
+
client_signal_handler();
flist_for_each_safe(entry, tmp, &client_list) {
struct fio_net_cmd *cmd;
int done = 0;
+ dprint(FD_NET, "client: handle %s\n", client->hostname);
+
while ((cmd = fio_net_recv_cmd(client->fd, 1)) != NULL) {
dprint(FD_NET, "%s: got cmd op %d\n", client->hostname,
cmd->opcode);
free(cmd);
done = 1;
break;
- case FIO_NET_CMD_TEXT:
- fprintf(f_out, "Client <%s>: ", client->hostname);
- fwrite(cmd->payload, cmd->pdu_len, 1, f_out);
+ case FIO_NET_CMD_TEXT: {
+ const char *buf = (const char *) cmd->payload;
+
+ if (!client->skip_newline)
+ fprintf(f_out, "Client <%s>: ", client->hostname);
+ fwrite(buf, cmd->pdu_len, 1, f_out);
fflush(f_out);
+ client->skip_newline = strchr(buf, '\n') == NULL;
free(cmd);
break;
+ }
case FIO_NET_CMD_TS:
handle_ts(cmd);
free(cmd);
assert(i == nr_clients);
- ret = poll(pfds, nr_clients, 100);
- if (ret < 0) {
- if (errno == EINTR)
+ do {
+ ret = poll(pfds, nr_clients, 100);
+ if (ret < 0) {
+ if (errno == EINTR)
+ continue;
+ log_err("fio: poll clients: %s\n", strerror(errno));
+ break;
+ } else if (!ret)
continue;
- log_err("fio: poll clients: %s\n", strerror(errno));
- break;
- } else if (!ret)
- continue;
+ } while (ret <= 0);
for (i = 0; i < nr_clients; i++) {
if (!(pfds[i].revents & POLLIN))