From c7e26c27c7e029e6670dfebc8f27d9295e9fdeb7 Mon Sep 17 00:00:00 2001 From: Jeremy Kerr Date: Mon, 19 Aug 2013 11:58:23 +0800 Subject: lib/waiter: handle -EINTR Now that we're handing non-fatal signals (i.e., SIGCHLD in the process lib), we need to gracefully handle -EINTR from poll(). Signed-off-by: Jeremy Kerr --- lib/waiter/waiter.c | 7 +++++-- ui/ncurses/nc-cui.c | 2 +- ui/twin/main-generic.c | 2 +- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/lib/waiter/waiter.c b/lib/waiter/waiter.c index e201ad1..d684348 100644 --- a/lib/waiter/waiter.c +++ b/lib/waiter/waiter.c @@ -3,6 +3,7 @@ #include #include #include +#include #include #include @@ -222,11 +223,13 @@ int waiter_poll(struct waitset *set) timeout_ms = -1; } - rc = poll(set->pollfds, set->n_io_waiters, timeout_ms); - if (rc < 0) + if (rc < 0) { + if (errno == EINTR) + rc = 0; goto out; + } for (i = 0; i < set->n_io_waiters; i++) { struct waiter *waiter = set->io_waiters[i]; diff --git a/ui/ncurses/nc-cui.c b/ui/ncurses/nc-cui.c index 4baaec1..71fec5e 100644 --- a/ui/ncurses/nc-cui.c +++ b/ui/ncurses/nc-cui.c @@ -594,7 +594,7 @@ int cui_run(struct cui *cui, struct pmenu *main, unsigned int default_item) while (1) { int result = waiter_poll(cui->waitset); - if (result < 0 && errno != EINTR) { + if (result < 0) { pb_log("%s: poll: %s\n", __func__, strerror(errno)); break; } diff --git a/ui/twin/main-generic.c b/ui/twin/main-generic.c index fcda709..99520d0 100644 --- a/ui/twin/main-generic.c +++ b/ui/twin/main-generic.c @@ -204,7 +204,7 @@ static int run(struct pbt_client *client) while (1) { int result = waiter_poll(client->waitset); - if (result < 0 && errno != EINTR) { + if (result < 0) { pb_log("%s: poll: %s\n", __func__, strerror(errno)); break; } -- cgit v1.2.1