+ waiter->active = false;
+ list_add(&set->free_list, &waiter->list);
+}
+
+static void update_waiters(struct waitset *set)
+{
+ int n_io, n_time, i_io, i_time, i;
+
+ if (!set->waiters_changed)
+ return;
+
+ n_io = n_time = 0;
+
+ for (i = 0; i < set->n_waiters; i++) {
+ if (set->waiters[i]->type == WAITER_IO)
+ n_io++;
+ else if (set->waiters[i]->type == WAITER_TIME)
+ n_time++;
+ }
+
+ /* realloc if counts have changed */
+ if (set->n_io_waiters != n_io) {
+ set->io_waiters = talloc_realloc(set, set->io_waiters,
+ struct waiter *, n_io);
+ set->pollfds = talloc_realloc(set, set->pollfds,
+ struct pollfd, n_io);
+ set->n_io_waiters = n_io;
+ }
+ if (set->n_time_waiters != n_time) {
+ set->time_waiters = talloc_realloc(set, set->time_waiters,
+ struct waiter *, n_time);
+ set->n_time_waiters = n_time;
+ }
+
+ i_io = 0;
+ i_time = 0;
+
+ timerclear(&set->next_timeout);
+
+ for (i = 0; i < set->n_waiters; i++) {
+ struct waiter *waiter = set->waiters[i];
+
+ /* IO waiters: copy to io_waiters, populate pollfds */
+ if (waiter->type == WAITER_IO) {
+ set->pollfds[i_io].fd = waiter->io.fd;
+ set->pollfds[i_io].events = waiter->io.events;
+ set->io_waiters[i_io] = waiter;
+ i_io++;
+ }
+
+ /* time waiters: copy to time_waiters, calculate next expiry */
+ if (waiter->type == WAITER_TIME) {
+ if (!timerisset(&set->next_timeout) ||
+ timercmp(&waiter->timeout,
+ &set->next_timeout, <))
+ set->next_timeout = waiter->timeout;
+
+ set->time_waiters[i_time] = waiter;
+ i_time++;
+ }
+ }