diff --git a/tools/libxl/libxl_event.c b/tools/libxl/libxl_event.c index b50d4e5074..3e76fa5af5 100644 --- a/tools/libxl/libxl_event.c +++ b/tools/libxl/libxl_event.c @@ -1417,6 +1417,7 @@ static void afterpoll_internal(libxl__egc *egc, libxl__poller *poller, } if (afterpoll_check_fd(poller,fds,nfds, poller->wakeup_pipe[0],POLLIN)) { + poller->pipe_nonempty = 0; int e = libxl__self_pipe_eatall(poller->wakeup_pipe[0]); if (e) LIBXL__EVENT_DISASTER(gc, "read wakeup", e, 0); } @@ -1809,6 +1810,8 @@ void libxl__poller_put(libxl_ctx *ctx, libxl__poller *p) void libxl__poller_wakeup(libxl__gc *gc, libxl__poller *p) { + if (p->pipe_nonempty) return; + p->pipe_nonempty = 1; int e = libxl__self_pipe_wakeup(p->wakeup_pipe[1]); if (e) LIBXL__EVENT_DISASTER(gc, "cannot poke watch pipe", e, 0); } diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index f2ff5e6c2d..2555aa4575 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -625,6 +625,7 @@ struct libxl__poller { int (*fd_rindices)[3]; /* see libxl_event.c:beforepoll_internal */ int wakeup_pipe[2]; /* 0 means no fd allocated */ + bool pipe_nonempty; /* * We also use the poller to record whether any fds have been