X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Fio%2Fpoll.c;h=7ceb8a7eec8bc6fd3f3de65c0c22e27a2e20e43e;hp=fdff271c64f26e09f060b9e52e468dcf80d97696;hb=02388bfc242abbd33c7ba64b2c32d425f5359b67;hpb=a2dffefa5ef8d0cf71d99755c4640a8004679b1d diff --git a/ccan/io/poll.c b/ccan/io/poll.c index fdff271c..7ceb8a7e 100644 --- a/ccan/io/poll.c +++ b/ccan/io/poll.c @@ -7,7 +7,7 @@ #include #include -static size_t num_fds = 0, max_fds = 0, num_next = 0, num_finished = 0; +static size_t num_fds = 0, max_fds = 0, num_next = 0, num_finished = 0, num_waiting = 0; static struct pollfd *pollfds = NULL; static struct fd **fds = NULL; @@ -65,7 +65,10 @@ static void del_fd(struct fd *fd) bool add_listener(struct io_listener *l) { - return add_fd(&l->fd, POLLIN); + if (!add_fd(&l->fd, POLLIN)) + return false; + num_waiting++; + return true; } bool add_conn(struct io_conn *c) @@ -123,6 +126,9 @@ void backend_set_state(struct io_conn *conn, struct io_op *op) enum io_state state = from_ioop(op); struct pollfd *pfd = &pollfds[conn->fd.backend_info]; + if (pfd->events) + num_waiting--; + pfd->events = pollmask(state); if (conn->duplex) { int mask = pollmask(conn->duplex->state); @@ -130,6 +136,8 @@ void backend_set_state(struct io_conn *conn, struct io_op *op) assert(!mask || pfd->events != mask); pfd->events |= mask; } + if (pfd->events) + num_waiting++; if (state == NEXT) num_next++; @@ -206,6 +214,9 @@ void *io_loop(void) if (num_fds == 0) break; + /* You can't tell them all to go to sleep! */ + assert(num_waiting); + r = poll(pollfds, num_fds, -1); if (r < 0) break;