Switch io_close(), io_input() from timeouts to deadlines
authorMarkus Armbruster <armbru@pond.sub.org>
Sun, 11 Mar 2012 06:14:24 +0000 (07:14 +0100)
committerMarkus Armbruster <armbru@pond.sub.org>
Sat, 31 Mar 2012 17:03:19 +0000 (19:03 +0200)
All users want deadlines.  Move the conversion from deadline to
timeout from callers to io.c, where it becoems an implementation
detail.

include/empio.h
src/lib/empthread/io.c
src/lib/player/accept.c
src/lib/player/login.c
src/lib/player/recvclient.c

index 51786505352cafe0e31e6032a4a6e9d0a57633b2..7d68eadb73d75866410eae0e2b16d14b057d1ec0 100644 (file)
@@ -32,7 +32,7 @@
 
 #ifndef EMPIO_H
 #define EMPIO_H
-#include <sys/time.h>
+#include <time.h>
 
 #define IO_READ                0x1
 #define IO_WRITE       0x2
@@ -43,9 +43,8 @@
 
 extern struct iop *io_open(int, int, int);
 extern void io_init(void);
-extern void io_close(struct iop *, struct timeval *);
-extern void io_timeout(struct timeval *, time_t);
-extern int io_input(struct iop *, struct timeval *);
+extern void io_close(struct iop *, time_t);
+extern int io_input(struct iop *, time_t);
 extern int io_inputwaiting(struct iop *);
 extern int io_outputwaiting(struct iop *);
 extern int io_output(struct iop *, int);
index b440a4f3e5cbfd0add227d018734f03bf561ee94..9b7955b50b72235009e37f37f69db5e36e6d184b 100644 (file)
@@ -65,6 +65,8 @@ struct iop {
     int last_out;
 };
 
+static struct timeval *io_timeout(struct timeval *, time_t);
+
 void
 io_init(void)
 {
@@ -104,14 +106,16 @@ io_open(int fd, int flags, int bufsize)
 }
 
 void
-io_close(struct iop *iop, struct timeval *timeout)
+io_close(struct iop *iop, time_t deadline)
 {
+    struct timeval timeout;
     char buf[IO_BUFSIZE];
     int ret;
 
     while (io_output(iop, 1) > 0) ;
     shutdown(iop->fd, SHUT_WR);
-    while (empth_select(iop->fd, EMPTH_FD_READ, timeout) > 0) {
+    while (empth_select(iop->fd, EMPTH_FD_READ,
+                       io_timeout(&timeout, deadline)) > 0) {
        ret = read(iop->fd, buf, sizeof(buf));
        if (ret <= 0)
            break;
@@ -124,11 +128,14 @@ io_close(struct iop *iop, struct timeval *timeout)
     free(iop);
 }
 
-void
+static struct timeval *
 io_timeout(struct timeval *timeout, time_t deadline)
 {
     struct timeval now;
 
+    if (deadline == (time_t)-1)
+       return NULL;            /* no deadline */
+
     gettimeofday(&now, NULL);
     if (now.tv_sec >= deadline) {
        /* deadline reached already */
@@ -140,20 +147,24 @@ io_timeout(struct timeval *timeout, time_t deadline)
        timeout->tv_usec = 999999 - now.tv_usec;
        /* yes, this is 1usec early; sue me */
     }
+
+    return timeout;
 }
 
 /*
  * Read input from IOP and enqueue it.
- * If TIMEOUT is non-null, wait at most that long for input to arrive.
- * Does not yield the processor when timeout is zero.
+ * Wait at most until DEADLINE for input to arrive.  (time_t)-1 means
+ * wait as long as it takes (no timeout).
+ * Does not yield the processor when DEADLINE is zero.
  * A wait for input can be cut short by empth_wakeup().
  * Return number of bytes read on success, -1 on error.
  * In particular, return zero on timeout, early wakeup or EOF.  Use
  * io_eof() to distinguish timeout and early wakeup from EOF.
  */
 int
-io_input(struct iop *iop, struct timeval *timeout)
+io_input(struct iop *iop, time_t deadline)
 {
+    struct timeval timeout;
     char buf[IO_BUFSIZE];
     int cc;
     int res;
@@ -165,8 +176,9 @@ io_input(struct iop *iop, struct timeval *timeout)
     if (iop->flags & IO_EOF)
        return 0;
 
-    if (!timeout || timeout->tv_sec || timeout->tv_usec) {
-       res = empth_select(iop->fd, EMPTH_FD_READ, timeout);
+    if (deadline) {
+       res = empth_select(iop->fd, EMPTH_FD_READ,
+                          io_timeout(&timeout, deadline));
        if (res < 0) {
            iop->flags |= IO_ERROR;
            return -1;
index ad1e78a0bef1e5405aa715c82e708a82b51050bc..8d459182d019aa12c37806fe9c4513da9dfc8975 100644 (file)
@@ -95,13 +95,11 @@ player_new(int s)
 struct player *
 player_delete(struct player *lp)
 {
-    struct timeval timeout;
     struct player *back;
 
     if (lp->iop) {
        /* it's a real player */
-       io_timeout(&timeout, player->curup + minutes(max_idle));
-       io_close(lp->iop, &timeout);
+       io_close(lp->iop, player->curup + minutes(max_idle));
        lp->iop = NULL;
     }
     back = (struct player *)lp->queue.q_back;
index 61e011d9bb17d6d0e101a95dbd16a1ea1a180008..4fac6e7d4a5bd188887154a57cd09a8a8d9d5b4e 100644 (file)
@@ -76,7 +76,6 @@ static struct cmndstr login_coms[] = {
 void
 player_login(void *ud)
 {
-    struct timeval timeout;
     char buf[128];
     char space[128];
     int ac;
@@ -90,8 +89,7 @@ player_login(void *ud)
     for (;;) {
        io_output(player->iop, 1);
        if (io_gets(player->iop, buf, sizeof(buf)) < 0) {
-           io_timeout(&timeout, player->curup + minutes(max_idle));
-           res = io_input(player->iop, &timeout);
+           res = io_input(player->iop, player->curup + minutes(max_idle));
            if (res <= 0) {
                if (res == 0 && !io_eof(player->iop))
                    pr_id(player, C_DATA, "idle connection terminated\n");
index f9e7d5bc8801a18ab8afee307ccd8d6822512edc..2f798cd558bc8ba7422dcf8348d8af0400a135fc 100644 (file)
@@ -61,7 +61,6 @@ int
 recvclient(char *cmd, int size)
 {
     int count, res;
-    struct timeval timeout;
 
     count = -1;
     while (!player->aborted) {
@@ -92,8 +91,7 @@ recvclient(char *cmd, int size)
        if (player->aborted)
            break;
 
-       io_timeout(&timeout, player->curup + minutes(max_idle));
-       res = io_input(player->iop, &timeout);
+       res = io_input(player->iop, player->curup + minutes(max_idle));
        if (res > 0)
            ;
        else if (res < 0)