rc = ERROR_FAIL; goto out;
}
- rc = libxl__ctx_evtchn_init(gc);
-
*pctx = ctx;
return 0;
for (i = 0; i < ctx->watch_nslots; i++)
assert(!libxl__watch_slot_contents(gc, i));
assert(!libxl__ev_fd_isregistered(&ctx->watch_efd));
- libxl__ev_fd_deregister(gc, &ctx->evtchn_efd);
+ assert(!libxl__ev_fd_isregistered(&ctx->evtchn_efd));
assert(!libxl__ev_fd_isregistered(&ctx->sigchld_selfpipe_efd));
/* Now there should be no more events requested from the application: */
rc = libxl_fd_set_nonblock(CTX, fd, 1);
if (rc) goto out;
- rc = libxl__ev_fd_register(gc, &CTX->evtchn_efd,
- evtchn_fd_callback, fd, POLLIN);
- if (rc) goto out;
-
CTX->xce = xce;
return 0;
return rc;
}
+static void evtchn_check_fd_deregister(libxl__gc *gc)
+{
+ if (CTX->xce && LIBXL_LIST_EMPTY(&CTX->evtchns_waiting))
+ libxl__ev_fd_deregister(gc, &CTX->evtchn_efd);
+}
+
int libxl__ev_evtchn_wait(libxl__gc *gc, libxl__ev_evtchn *evev)
{
int r, rc;
DBG("ev_evtchn=%p port=%d wait (was waiting=%d)",
evev, evev->port, evev->waiting);
+ rc = libxl__ctx_evtchn_init(gc);
+ if (rc) goto out;
+
+ if (!libxl__ev_fd_isregistered(&CTX->evtchn_efd)) {
+ rc = libxl__ev_fd_register(gc, &CTX->evtchn_efd, evtchn_fd_callback,
+ xc_evtchn_fd(CTX->xce), POLLIN);
+ if (rc) goto out;
+ }
+
if (evev->waiting)
return 0;
return 0;
out:
+ evtchn_check_fd_deregister(gc);
return rc;
}
evev->waiting = 0;
LIBXL_LIST_REMOVE(evev, entry);
+ evtchn_check_fd_deregister(gc);
}
/*