X-Git-Url: https://git.archive.openwrt.org/?a=blobdiff_plain;f=uloop.c;h=4de26d40ce3dd376c5b1859dd0dfc92559f3a512;hb=5038992465876ba0985372b64fb451f1e4fdb8fc;hp=bdda0cf7d244d41c7bf8db81012abad36288eee6;hpb=63bc6593c37b4757199fb65ec1fb607c5e5190e3;p=project%2Flibubox.git diff --git a/uloop.c b/uloop.c index bdda0cf..4de26d4 100644 --- a/uloop.c +++ b/uloop.c @@ -231,12 +231,12 @@ static void uloop_run_events(int timeout) if (!u) continue; - if(events[n].events & EPOLLERR) { + if(events[n].events & (EPOLLERR|EPOLLHUP)) { u->error = true; uloop_fd_delete(u); } - if(!(events[n].events & (EPOLLRDHUP|EPOLLIN|EPOLLOUT|EPOLLERR))) + if(!(events[n].events & (EPOLLRDHUP|EPOLLIN|EPOLLOUT|EPOLLERR|EPOLLHUP))) continue; if(events[n].events & EPOLLRDHUP) @@ -455,6 +455,22 @@ static void uloop_process_timeouts(struct timeval *tv) } } +static void uloop_clear_timeouts(void) +{ + struct uloop_timeout *t, *tmp; + + list_for_each_entry_safe(t, tmp, &timeouts, list) + uloop_timeout_cancel(t); +} + +static void uloop_clear_processes(void) +{ + struct uloop_process *p, *tmp; + + list_for_each_entry_safe(p, tmp, &processes, list) + uloop_process_delete(p); +} + void uloop_run(void) { struct timeval tv; @@ -480,4 +496,7 @@ void uloop_done(void) close(poll_fd); poll_fd = -1; + + uloop_clear_timeouts(); + uloop_clear_processes(); }