return revents;
}
-static void fd_occurs(libxl__egc *egc, libxl__ev_fd *efd, short revents)
+static void fd_occurs(libxl__egc *egc, libxl__ev_fd *efd, short revents_ign)
{
- DBG("ev_fd=%p occurs fd=%d events=%x revents=%x",
- efd, efd->fd, efd->events, revents);
+ short revents_current = libxl__fd_poll_recheck(egc, efd->fd, efd->events);
- efd->func(egc, efd, efd->fd, efd->events, revents);
+ DBG("ev_fd=%p occurs fd=%d events=%x revents_ign=%x revents_current=%x",
+ efd, efd->fd, efd->events, revents_ign, revents_current);
+
+ if (revents_current)
+ efd->func(egc, efd, efd->fd, efd->events, revents_current);
}
static void afterpoll_internal(libxl__egc *egc, libxl__poller *poller,
if (!ev) goto out;
if (ev->fd != fd) goto out;
- short current_revents = libxl__fd_poll_recheck(egc, ev->fd, ev->events);
-
- if (current_revents)
- ev->func(egc, ev, fd, ev->events, current_revents);
+ fd_occurs(egc, ev, revents_ign);
out:
CTX_UNLOCK;
*
* It is not permitted to listen for the same or overlapping events
* on the same fd using multiple different libxl__ev_fd's.
+ *
+ * (Spurious wakeups, and spurious bits set in revents, are
+ * suppressed by the libxl event core.)
*/
struct libxl__ev_fd {
/* caller should include this in their own struct */