}
void
-fifo_expire_one(Fifo *f, struct timespec t, char *buf)
+fifo_expire(Fifo *f, struct timespec t, char *buf)
{
struct timespec td;
}
}
-void
-fifo_expire_all(Config *cfg, struct timespec t, char *buf)
-{
- Fifo *f;
-
- for (f = cfg->fifos; f; f = f->next)
- fifo_expire_one(f, t, buf);
-}
-
void
fifo_read_error(Fifo *f, char *buf)
{
debug("ready: %d\n", ready);
assert(ready >= 0);
clock_gettime(CLOCK_MONOTONIC, &t);
- while (ready) {
+ /* At-least-once ensures that expiries are still checked on timeouts. */
+ do {
for (Fifo *f = cfg->fifos; f; f = f->next) {
if (FD_ISSET(f->fd, &fds)) {
debug("reading: %s\n", f->name);
default:
assert(0);
}
+ } else {
+ fifo_expire(f, t, buf);
}
}
- }
+ } while (ready);
assert(ready == 0);
}
puts(buf);
fflush(stdout);
}
-
- /*
- * This is a good place for expiry check, since we're about to
- * sleep anyway and the time taken by the check will be
- * subtracted from the sleep period.
- */
- fifo_expire_all(cfg, t0, buf);
-
clock_gettime(CLOCK_MONOTONIC, &t1); // FIXME: check errors
timespecsub(&t1, &t0, &td);
debug("td {tv_sec = %ld, tv_nsec = %ld}\n", td.tv_sec, td.tv_nsec);