6 #include <talloc/talloc.h>
19 struct waiter **waiters;
21 struct pollfd *pollfds;
25 struct waitset *waitset_create(void *ctx)
27 struct waitset *set = talloc_zero(ctx, struct waitset);
31 void waitset_destroy(struct waitset *set)
36 struct waiter *waiter_register(struct waitset *set, int fd, int events,
37 waiter_cb callback, void *arg)
39 struct waiter **waiters, *waiter;
41 waiters = talloc_realloc(set, set->waiters,
42 struct waiter *, set->n_waiters + 1);
47 set->waiters = waiters;
50 waiter = talloc(set->waiters, struct waiter);
54 set->waiters[set->n_waiters - 1] = waiter;
58 waiter->events = events;
59 waiter->callback = callback;
65 void waiter_remove(struct waiter *waiter)
67 struct waitset *set = waiter->set;
70 for (i = 0; i < set->n_waiters; i++)
71 if (set->waiters[i] == waiter)
74 assert(i < set->n_waiters);
77 memmove(&set->waiters[i], &set->waiters[i+1],
78 (set->n_waiters - i) * sizeof(set->waiters[0]));
80 set->waiters = talloc_realloc(set->waiters, set->waiters,
81 struct waiter *, set->n_waiters);
86 int waiter_poll(struct waitset *set)
90 if (set->n_waiters != set->n_pollfds) {
91 set->pollfds = talloc_realloc(set, set->pollfds,
92 struct pollfd, set->n_waiters);
93 set->n_pollfds = set->n_waiters;
96 for (i = 0; i < set->n_waiters; i++) {
97 set->pollfds[i].fd = set->waiters[i]->fd;
98 set->pollfds[i].events = set->waiters[i]->events;
99 set->pollfds[i].revents = 0;
102 rc = poll(set->pollfds, set->n_waiters, -1);
107 for (i = 0; i < set->n_waiters; i++) {
108 if (set->pollfds[i].revents) {
109 rc = set->waiters[i]->callback(set->waiters[i]->arg);
112 waiter_remove(set->waiters[i]);