X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=server.c;h=38f690bd9ca81b886c3b90a6631a0548cb3962a9;hp=541216ca6a77f41d9001ded8ecc3e51ef54f17dc;hb=009b1be41b32bf7e32b441c6a22e3ae628ec9b89;hpb=5c341e9a5734742ae1137388345d4f47efdd4f05 diff --git a/server.c b/server.c index 541216ca..38f690bd 100644 --- a/server.c +++ b/server.c @@ -21,13 +21,38 @@ static int net_port = 8765; +int exit_backend = 0; + static int accept_loop(int listen_sk) { struct sockaddr addr; unsigned int len = sizeof(addr); - int sk, do_exit = 0; + struct pollfd pfd; + int ret, sk, flags; + flags = fcntl(listen_sk, F_GETFL); + flags |= O_NONBLOCK; + fcntl(listen_sk, F_SETFL, flags); again: + pfd.fd = listen_sk; + pfd.events = POLLIN; + do { + ret = poll(&pfd, 1, 100); + if (ret < 0) { + if (errno == EINTR) + break; + perror("poll"); + goto out; + } else if (!ret) + continue; + + if (pfd.revents & POLLIN) + break; + } while (!exit_backend); + + if (exit_backend) + goto out; + sk = accept(listen_sk, &addr, &len); if (sk < 0) { log_err("fio: accept failed\n"); @@ -35,14 +60,13 @@ again: } /* read forever */ - while (!do_exit) { + while (!exit_backend) { char buf[131072]; - int ret; ret = recv(sk, buf, 4096, 0); if (ret > 0) { if (!strncmp("FIO_QUIT", buf, 8)) { - do_exit = 1; + exit_backend = 1; break; } parse_jobs_ini(buf, 1, 0); @@ -58,9 +82,10 @@ again: close(sk); - if (!do_exit) + if (!exit_backend) goto again; +out: return 0; }