X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Fio%2Fpoll.c;h=4cc9f4b7dc901c36ae4bf0869c0d1ebc9cee6c52;hb=c16c021735d53348b6f5fe119e35feea85e6638e;hp=a02152e3792ae07569d4a75b1ca423ecce5fb626;hpb=b089d462e533d2b304cc28b9ad277cbfa53f12ce;p=ccan diff --git a/ccan/io/poll.c b/ccan/io/poll.c index a02152e3..4cc9f4b7 100644 --- a/ccan/io/poll.c +++ b/ccan/io/poll.c @@ -91,6 +91,10 @@ static void del_fd(struct fd *fd) pollfds = tal_free(pollfds); fds = NULL; max_fds = 0; + if (num_always == 0) { + always = tal_free(always); + max_always = 0; + } } num_fds--; fd->backend_info = -1; @@ -117,7 +121,9 @@ bool add_listener(struct io_listener *l) static int find_always(const struct io_plan *plan) { - for (size_t i = 0; i < num_always; i++) + size_t i = 0; + + for (i = 0; i < num_always; i++) if (always[i] == plan) return i; return -1; @@ -140,7 +146,7 @@ static void remove_from_always(const struct io_plan *plan) /* Only free if no fds left either. */ if (num_always == 0 && max_fds == 0) { - tal_free(always); + always = tal_free(always); max_always = 0; } } @@ -283,8 +289,10 @@ static bool *exclusive(struct io_plan *plan) /* For simplicity, we do one always at a time */ static bool handle_always(void) { + int i; + /* Backwards is simple easier to remove entries */ - for (int i = num_always - 1; i >= 0; i--) { + for (i = num_always - 1; i >= 0; i--) { struct io_plan *plan = always[i]; if (num_exclusive && !*exclusive(plan)) @@ -319,10 +327,12 @@ bool backend_set_exclusive(struct io_plan *plan, bool excl) * else that we manipulate events. */ static void exclude_pollfds(void) { + size_t i; + if (num_exclusive == 0) return; - for (size_t i = 0; i < num_fds; i++) { + for (i = 0; i < num_fds; i++) { struct pollfd *pfd = &pollfds[fds[i]->backend_info]; if (!fds[i]->exclusive[IO_IN]) @@ -339,10 +349,12 @@ static void exclude_pollfds(void) static void restore_pollfds(void) { + size_t i; + if (num_exclusive == 0) return; - for (size_t i = 0; i < num_fds; i++) { + for (i = 0; i < num_fds; i++) { struct pollfd *pfd = &pollfds[fds[i]->backend_info]; if (fds[i]->listener) {