Replace parameter wait by deadline. Non-zero wait argument becomes
(time_t)-1 argument, zero wait argument becomes zero deadline
argument. No functional change, yet.
extern int io_input(struct iop *, time_t);
extern int io_inputwaiting(struct iop *);
extern int io_outputwaiting(struct iop *);
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);
-extern int io_output_if_queue_long(struct iop *, int);
+extern int io_output(struct iop *, time_t);
+extern int io_output_if_queue_long(struct iop *, time_t);
extern int io_peek(struct iop *, char *, int);
extern int io_read(struct iop *, char *, int);
extern int io_write(struct iop *, char *, int);
extern int io_peek(struct iop *, char *, int);
extern int io_read(struct iop *, char *, int);
extern int io_write(struct iop *, char *, int);
char buf[IO_BUFSIZE];
int ret;
char buf[IO_BUFSIZE];
int ret;
- while (io_output(iop, 1) > 0) ;
+ while (io_output(iop, (time_t)-1) > 0) ;
shutdown(iop->fd, SHUT_WR);
while (empth_select(iop->fd, EMPTH_FD_READ,
io_timeout(&timeout, deadline)) > 0) {
shutdown(iop->fd, SHUT_WR);
while (empth_select(iop->fd, EMPTH_FD_READ,
io_timeout(&timeout, deadline)) > 0) {
/*
* Write output queued in IOP.
/*
* Write output queued in IOP.
- * If WAIT, writing may put the thread to sleep.
+ * 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 output can be cut short by empth_wakeup().
* Return number of bytes written on success, -1 on error.
* In particular, return zero when nothing was written because the
* Return number of bytes written on success, -1 on error.
* In particular, return zero when nothing was written because the
- * queue was empty, or because the write slept and got woken up (only
- * if WAIT), or because the write refused to sleep (only if !WAIT).
+ * queue is empty, and on timeout or early wakeup. Use
+ * io_outputwaiting() to distinguish timeout and early wakeup from
+ * empty queue.
-io_output(struct iop *iop, int wait)
+io_output(struct iop *iop, time_t deadline)
+ struct timeval timeout;
struct iovec iov[16];
int n, res, cc;
struct iovec iov[16];
int n, res, cc;
ef_make_stale();
if ((iop->flags & IO_WRITE) == 0)
ef_make_stale();
if ((iop->flags & IO_WRITE) == 0)
if (!ioq_qsize(iop->output))
return 0;
if (!ioq_qsize(iop->output))
return 0;
- if (wait) {
- res = empth_select(iop->fd, EMPTH_FD_WRITE, NULL);
+ if (deadline) {
+ res = empth_select(iop->fd, EMPTH_FD_WRITE,
+ io_timeout(&timeout, deadline));
if (res == 0)
return 0;
if (res < 0) {
if (res == 0)
return 0;
if (res < 0) {
/*
* Write output queued in IOP if enough have been enqueued.
* Write if at least one buffer has been filled since the last write.
/*
* Write output queued in IOP if enough have been enqueued.
* Write if at least one buffer has been filled since the last write.
- * If WAIT, writing may put the thread to sleep.
+ * Wait at most until DEADLINE for output to be accepted. (time_t)-1
+ * means wait as long as it takes (no timeout).
+ * Does not yield the processor when DEADLINE is zero.
+ * A wait for output can be cut short by empth_wakeup().
* Return number of bytes written on success, -1 on error.
* In particular, return zero when nothing was written because the
* Return number of bytes written on success, -1 on error.
* In particular, return zero when nothing was written because the
- * queue was not long, or the write slept and got woken up (only if
- * WAIT), or the write refused to sleep (only if !WAIT).
+ * queue isn't long, and on timeout or early wakeup.
-io_output_if_queue_long(struct iop *iop, int wait)
+io_output_if_queue_long(struct iop *iop, time_t deadline)
{
int len = ioq_qsize(iop->output);
if (CANT_HAPPEN(iop->last_out > len))
iop->last_out = 0;
if (len - iop->last_out < iop->bufsize) {
{
int len = ioq_qsize(iop->output);
if (CANT_HAPPEN(iop->last_out > len))
iop->last_out = 0;
if (len - iop->last_out < iop->bufsize) {
ef_make_stale();
return 0;
}
ef_make_stale();
return 0;
}
- return io_output(iop, wait);
+ return io_output(iop, deadline);
pr_id(player, C_INIT, "Empire server ready\n");
for (;;) {
pr_id(player, C_INIT, "Empire server ready\n");
for (;;) {
- io_output(player->iop, 1);
+ io_output(player->iop, (time_t)-1);
if (io_gets(player->iop, buf, sizeof(buf)) < 0) {
res = io_input(player->iop, player->curup + minutes(max_idle));
if (res <= 0) {
if (io_gets(player->iop, buf, sizeof(buf)) < 0) {
res = io_input(player->iop, player->curup + minutes(max_idle));
if (res <= 0) {
recvclient(char *cmd, int size)
{
int count, res;
recvclient(char *cmd, int size)
{
int count, res;
count = -1;
while (!player->aborted) {
count = -1;
while (!player->aborted) {
* Flush all queued output before potentially sleeping in
* io_input(), to make sure player sees the prompt.
*/
* Flush all queued output before potentially sleeping in
* io_input(), to make sure player sees the prompt.
*/
- while (io_output(player->iop,
- player->may_sleep >= PLAYER_SLEEP_ON_INPUT) > 0)
+ deadline = (time_t)(player->may_sleep >= PLAYER_SLEEP_ON_INPUT
+ ? -1 : 0);
+ while (io_output(player->iop, deadline) > 0)
* Dave Pare, 1986, 1989
* Steve McClure, 1998-2000
* Ron Koenderink, 2005
* Dave Pare, 1986, 1989
* Steve McClure, 1998-2000
* Ron Koenderink, 2005
- * Markus Armbruster, 2005-2011
+ * Markus Armbruster, 2005-2012
char *p;
char *bp;
int len;
char *p;
char *bp;
int len;
journal_output(pl, id, buf);
journal_output(pl, id, buf);
- while (io_output_if_queue_long(pl->iop,
- pl->may_sleep == PLAYER_SLEEP_FREELY) > 0)
+ deadline = (time_t)(pl->may_sleep == PLAYER_SLEEP_FREELY
+ ? -1 : 0);
+ while (io_output_if_queue_long(pl->iop, deadline) > 0)
int standout = 0;
char printbuf[2];
char ch;
int standout = 0;
char printbuf[2];
char ch;
journal_output(pl, id, buf);
journal_output(pl, id, buf);
- while (io_output_if_queue_long(pl->iop,
- pl->may_sleep == PLAYER_SLEEP_FREELY) > 0)
+ deadline = (time_t)(pl->may_sleep == PLAYER_SLEEP_FREELY
+ ? -1 : 0);
+ while (io_output_if_queue_long(pl->iop, deadline) > 0)