X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=server.c;h=6f216d5d1aa83d794b75ca94e2c9668a196ea86b;hb=19c65179fad3e0a32a450401ba7d312169627fdd;hp=0f64c23586aef13f3b830ab4effd650553a12e9f;hpb=802ad4a83e92a30b5fdccf117d59fbb69068c054;p=fio.git diff --git a/server.c b/server.c index 0f64c235..6f216d5d 100644 --- a/server.c +++ b/server.c @@ -113,7 +113,7 @@ static int verify_convert_cmd(struct fio_net_cmd *cmd) /* * Read (and defragment, if necessary) incoming commands */ -struct fio_net_cmd *fio_net_recv_cmd(int sk, int block) +struct fio_net_cmd *fio_net_recv_cmd(int sk) { struct fio_net_cmd cmd, *cmdret = NULL; size_t cmd_size = 0, pdu_offset = 0; @@ -122,37 +122,6 @@ struct fio_net_cmd *fio_net_recv_cmd(int sk, int block) void *pdu = NULL; do { - struct pollfd pfd; - - pfd.fd = sk; - pfd.events = POLLIN; - ret = 0; - do { - int timeo = block ? 100 : 10; - - ret = poll(&pfd, 1, timeo); - if (ret < 0) { - if (errno == EINTR) - break; - log_err("fio: poll: %s\n", strerror(errno)); - break; - } else if (!ret) { - if (!block) - return NULL; - continue; - } - - if (pfd.revents & POLLIN) - break; - if (pfd.revents & (POLLERR|POLLHUP)) { - ret = 1; - break; - } - } while (ret >= 0 && block); - - if (ret < 0) - break; - ret = fio_recv_data(sk, &cmd, sizeof(cmd)); if (ret) break; @@ -282,8 +251,10 @@ static int handle_job_cmd(struct fio_net_cmd *cmd) char *buf = (char *) cmd->payload; int ret; - if (parse_jobs_ini(buf, 1, 0)) + if (parse_jobs_ini(buf, 1, 0)) { + fio_server_send_quit_cmd(); return -1; + } fio_net_send_simple_cmd(server_fd, FIO_NET_CMD_START, 0); @@ -308,8 +279,10 @@ static int handle_jobline_cmd(struct fio_net_cmd *cmd) dprint(FD_NET, "server: %d: %s\n", i, argv[i]); } - if (parse_cmd_line(pdu->argc, argv)) + if (parse_cmd_line(pdu->argc, argv)) { + fio_server_send_quit_cmd(); return -1; + } fio_net_send_simple_cmd(server_fd, FIO_NET_CMD_START, 0); @@ -372,7 +345,37 @@ static int handle_connection(int sk, int block) /* read forever */ while (!exit_backend) { - cmd = fio_net_recv_cmd(sk, block); + struct pollfd pfd = { + .fd = sk, + .events = POLLIN, + }; + + ret = 0; + do { + ret = poll(&pfd, 1, 100); + if (ret < 0) { + if (errno == EINTR) + break; + log_err("fio: poll: %s\n", strerror(errno)); + break; + } else if (!ret) { + if (!block) + return 0; + continue; + } + + if (pfd.revents & POLLIN) + break; + if (pfd.revents & (POLLERR|POLLHUP)) { + ret = 1; + break; + } + } while (!exit_backend); + + if (ret < 0) + break; + + cmd = fio_net_recv_cmd(sk); if (!cmd) { ret = -1; break;