static struct fd **fds = NULL;
static LIST_HEAD(closing);
static LIST_HEAD(always);
+static struct timemono (*nowfn)(void) = time_mono;
+
+struct timemono (*io_time_override(struct timemono (*now)(void)))(void)
+{
+ struct timemono (*old)(void) = nowfn;
+ nowfn = now;
+ return old;
+}
static bool add_fd(struct fd *fd, short events)
{
}
/* This is the main loop. */
-void *io_loop(struct timers *timers, struct list_head *expired)
+void *io_loop(struct timers *timers, struct timer **expired)
{
void *ret;
/* if timers is NULL, expired must be. If not, not. */
assert(!timers == !expired);
- /* Make sure this is empty if we exit for some other reason. */
+ /* Make sure this is NULL if we exit for some other reason. */
if (expired)
- list_head_init(expired);
+ *expired = NULL;
while (!io_loop_return) {
int i, r, ms_timeout = -1;
assert(num_waiting);
if (timers) {
- struct timeabs now, first;
+ struct timemono now, first;
- now = time_now();
+ now = nowfn();
/* Call functions for expired timers. */
- timers_expire(timers, now, expired);
- if (!list_empty(expired))
+ *expired = timers_expire(timers, now);
+ if (*expired)
break;
/* Now figure out how long to wait for the next one. */
if (timer_earliest(timers, &first)) {
uint64_t next;
- next = time_to_msec(time_between(first, now));
+ next = time_to_msec(timemono_between(first, now));
if (next < INT_MAX)
ms_timeout = next;
else