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);
48 set->waiters = waiters;
50 waiter = &set->waiters[set->n_waiters - 1];
54 waiter->events = events;
55 waiter->callback = callback;
61 void waiter_remove(struct waiter *waiter)
63 struct waitset *set = waiter->set;
66 i = waiter - set->waiters;
67 assert(i >= 0 && i < set->n_waiters);
70 memmove(&set->waiters[i], &set->waiters[i+1],
71 (set->n_waiters - i) * sizeof(set->waiters[0]));
73 set->waiters = talloc_realloc(set->waiters, set->waiters, struct waiter,
77 int waiter_poll(struct waitset *set)
81 if (set->n_waiters != set->n_pollfds) {
82 set->pollfds = talloc_realloc(set, set->pollfds,
83 struct pollfd, set->n_waiters);
84 set->n_pollfds = set->n_waiters;
87 for (i = 0; i < set->n_waiters; i++) {
88 set->pollfds[i].fd = set->waiters[i].fd;
89 set->pollfds[i].events = set->waiters[i].events;
90 set->pollfds[i].revents = 0;
93 rc = poll(set->pollfds, set->n_waiters, -1);
98 for (i = 0; i < set->n_waiters; i++) {
99 if (set->pollfds[i].revents) {
100 rc = set->waiters[i].callback(set->waiters[i].arg);
103 waiter_remove(&set->waiters[i]);