void libxl__datacopier_init(libxl__datacopier_state *dc)
{
assert(dc->ao);
+ libxl__ao_abortable_init(&dc->abrt);
libxl__ev_fd_init(&dc->toread);
libxl__ev_fd_init(&dc->towrite);
LIBXL_TAILQ_INIT(&dc->bufs);
STATE_AO_GC(dc->ao);
libxl__datacopier_buf *buf, *tbuf;
+ libxl__ao_abortable_deregister(&dc->abrt);
libxl__ev_fd_deregister(gc, &dc->toread);
libxl__ev_fd_deregister(gc, &dc->towrite);
LIBXL_TAILQ_FOREACH_SAFE(buf, &dc->bufs, entry, tbuf)
return 0;
}
+static void datacopier_abort(libxl__egc *egc, libxl__ao_abortable *abrt,
+ int rc)
+{
+ libxl__datacopier_state *dc = CONTAINER_OF(abrt, *dc, abrt);
+ STATE_AO_GC(dc->ao);
+
+ datacopier_callback(egc, dc, rc, -1, 0);
+}
+
static void datacopier_readable(libxl__egc *egc, libxl__ev_fd *ev,
int fd, short events, short revents) {
libxl__datacopier_state *dc = CONTAINER_OF(ev, *dc, toread);
assert(dc->readfd >= 0 || dc->writefd >= 0);
assert(!(dc->readbuf && dc->bytes_to_read == -1));
+ dc->abrt.ao = ao;
+ dc->abrt.callback = datacopier_abort;
+ rc = libxl__ao_abortable_register(&dc->abrt);
+ if (rc) goto out;
+
if (dc->readfd >= 0) {
rc = libxl__ev_fd_register(gc, &dc->toread, datacopier_readable,
dc->readfd, POLLIN);
fd. The buffer should be at least as large as the
bytes_to_read parameter, which should not be -1. */
/* remaining fields are private to datacopier */
+ libxl__ao_abortable abrt;
libxl__ev_fd toread, towrite;
ssize_t used;
LIBXL_TAILQ_HEAD(libxl__datacopier_bufs, libxl__datacopier_buf) bufs;