server: idle loop support

Signed-off-by: Jens Axboe <axboe@kernel.dk>
diff --git a/server.c b/server.c
index 938f58b..a48842e 100644
--- a/server.c
+++ b/server.c
@@ -111,7 +111,7 @@
 /*
  * Read (and defragment, if necessary) incoming commands
  */
-struct fio_net_cmd *fio_net_recv_cmd(int sk)
+struct fio_net_cmd *fio_net_recv_cmd(int sk, int block)
 {
 	struct fio_net_cmd cmd, *cmdret = NULL;
 	size_t cmd_size = 0, pdu_offset = 0;
@@ -126,14 +126,19 @@
 		pfd.events = POLLIN;
 		ret = 0;
 		do {
-			ret = poll(&pfd, 1, 100);
+			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)
+			} else if (!ret) {
+				if (!block)
+					return NULL;
 				continue;
+			}
 
 			if (pfd.revents & POLLIN)
 				break;
@@ -141,7 +146,7 @@
 				ret = 1;
 				break;
 			}
-		} while (ret >= 0);
+		} while (ret >= 0 && block);
 
 		if (ret < 0)
 			break;
@@ -311,14 +316,14 @@
 	return ret;
 }
 
-static int handle_connection(int sk)
+static int handle_connection(int sk, int block)
 {
 	struct fio_net_cmd *cmd = NULL;
 	int ret = 0;
 
 	/* read forever */
 	while (!exit_backend) {
-		cmd = fio_net_recv_cmd(sk);
+		cmd = fio_net_recv_cmd(sk, block);
 		if (!cmd) {
 			ret = -1;
 			break;
@@ -341,7 +346,7 @@
 void fio_server_idle_loop(void)
 {
 	if (server_fd != -1)
-		handle_connection(server_fd);
+		handle_connection(server_fd, 0);
 }
 
 static int accept_loop(int listen_sk)
@@ -384,7 +389,7 @@
 
 	server_fd = sk;
 
-	exitval = handle_connection(sk);
+	exitval = handle_connection(sk, 1);
 
 	server_fd = -1;
 	close(sk);