From ddbcce12c31d8c4a2ee58e89589231b27f39c874 Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Sun, 11 Mar 2012 07:14:24 +0100 Subject: [PATCH] Switch io_close(), io_input() from timeouts to deadlines 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 | 7 +++---- src/lib/empthread/io.c | 28 ++++++++++++++++++++-------- src/lib/player/accept.c | 4 +--- src/lib/player/login.c | 4 +--- src/lib/player/recvclient.c | 4 +--- 5 files changed, 26 insertions(+), 21 deletions(-) diff --git a/include/empio.h b/include/empio.h index 517865053..7d68eadb7 100644 --- a/include/empio.h +++ b/include/empio.h @@ -32,7 +32,7 @@ #ifndef EMPIO_H #define EMPIO_H -#include +#include #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); diff --git a/src/lib/empthread/io.c b/src/lib/empthread/io.c index b440a4f3e..9b7955b50 100644 --- a/src/lib/empthread/io.c +++ b/src/lib/empthread/io.c @@ -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; diff --git a/src/lib/player/accept.c b/src/lib/player/accept.c index ad1e78a0b..8d459182d 100644 --- a/src/lib/player/accept.c +++ b/src/lib/player/accept.c @@ -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; diff --git a/src/lib/player/login.c b/src/lib/player/login.c index 61e011d9b..4fac6e7d4 100644 --- a/src/lib/player/login.c +++ b/src/lib/player/login.c @@ -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"); diff --git a/src/lib/player/recvclient.c b/src/lib/player/recvclient.c index f9e7d5bc8..2f798cd55 100644 --- a/src/lib/player/recvclient.c +++ b/src/lib/player/recvclient.c @@ -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) -- 2.43.0