aboutsummaryrefslogtreecommitdiffstats
path: root/tools/libxl/libxl_event.c
diff options
context:
space:
mode:
authorIan Jackson <ian.jackson@eu.citrix.com>2012-05-11 18:58:55 +0100
committerIan Jackson <ian.jackson@eu.citrix.com>2012-05-11 18:58:55 +0100
commit9104f1857f6e732e5e90c296b1575bbe72923ff7 (patch)
tree16c01178afd0027a4ce61d8ba18edc05f4ac1007 /tools/libxl/libxl_event.c
parent343d66a666478e06e98b54be9ec8e9abfdfcd696 (diff)
downloadxen-9104f1857f6e732e5e90c296b1575bbe72923ff7.tar.gz
xen-9104f1857f6e732e5e90c296b1575bbe72923ff7.tar.bz2
xen-9104f1857f6e732e5e90c296b1575bbe72923ff7.zip
libxl: handle POLLERR, POLLHUP, POLLNVAL properly
Pass POLLERR and POLLHUP to fd callbacks, as is necessary. Crash on POLLNVAL since that means our fds are messed up. Document the behaviour (including the fact that poll sometimes sets POLLHUP or POLLERR even if only POLLIN was requested. Fix the one current fd callback to do something with POLLERR|POLLHUP. Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com> Acked-by: Ian Campbell <ian.campbell@citrix.com> Committed-by: Ian Jackson <Ian.Jackson@eu.citrix.com>
Diffstat (limited to 'tools/libxl/libxl_event.c')
-rw-r--r--tools/libxl/libxl_event.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/tools/libxl/libxl_event.c b/tools/libxl/libxl_event.c
index e11a4e7603..5046938fd8 100644
--- a/tools/libxl/libxl_event.c
+++ b/tools/libxl/libxl_event.c
@@ -339,6 +339,9 @@ static void watchfd_callback(libxl__egc *egc, libxl__ev_fd *ev,
{
EGC_GC;
+ if (revents & (POLLERR|POLLHUP))
+ LIBXL__EVENT_DISASTER(egc, "unexpected poll event on watch fd", 0, 0);
+
for (;;) {
char **event = xs_check_watch(CTX->xsh);
if (!event) {
@@ -743,7 +746,9 @@ static int afterpoll_check_fd(libxl__poller *poller,
/* again, stale slot entry */
return 0;
- int revents = fds[slot].revents & events;
+ assert(!(fds[slot].revents & POLLNVAL));
+
+ int revents = fds[slot].revents & (events | POLLERR | POLLHUP);
/* we mask in case requested events have changed */
return revents;