Lines Matching refs:dc
103 void libxl__datacopier_init(libxl__datacopier_state *dc) in libxl__datacopier_init() argument
105 assert(dc->ao); in libxl__datacopier_init()
106 libxl__ao_abortable_init(&dc->abrt); in libxl__datacopier_init()
107 libxl__ev_fd_init(&dc->toread); in libxl__datacopier_init()
108 libxl__ev_fd_init(&dc->towrite); in libxl__datacopier_init()
109 LIBXL_TAILQ_INIT(&dc->bufs); in libxl__datacopier_init()
112 void libxl__datacopier_kill(libxl__datacopier_state *dc) in libxl__datacopier_kill() argument
114 STATE_AO_GC(dc->ao); in libxl__datacopier_kill()
117 libxl__ao_abortable_deregister(&dc->abrt); in libxl__datacopier_kill()
118 libxl__ev_fd_deregister(gc, &dc->toread); in libxl__datacopier_kill()
119 libxl__ev_fd_deregister(gc, &dc->towrite); in libxl__datacopier_kill()
120 LIBXL_TAILQ_FOREACH_SAFE(buf, &dc->bufs, entry, tbuf) in libxl__datacopier_kill()
122 LIBXL_TAILQ_INIT(&dc->bufs); in libxl__datacopier_kill()
125 static void datacopier_callback(libxl__egc *egc, libxl__datacopier_state *dc, in datacopier_callback() argument
128 libxl__datacopier_kill(dc); in datacopier_callback()
129 dc->callback(egc, dc, rc, onwrite, errnoval); in datacopier_callback()
135 static void datacopier_check_state(libxl__egc *egc, libxl__datacopier_state *dc) in datacopier_check_state() argument
137 STATE_AO_GC(dc->ao); in datacopier_check_state()
140 if (dc->used && !dc->readbuf) { in datacopier_check_state()
141 if (!libxl__ev_fd_isregistered(&dc->towrite)) { in datacopier_check_state()
142 rc = libxl__ev_fd_register(gc, &dc->towrite, datacopier_writable, in datacopier_check_state()
143 dc->writefd, POLLOUT); in datacopier_check_state()
146 " during copy of %s", dc->writewhat, dc->copywhat); in datacopier_check_state()
147 datacopier_callback(egc, dc, ERROR_FAIL, -1, EIO); in datacopier_check_state()
151 } else if (!libxl__ev_fd_isregistered(&dc->toread) || in datacopier_check_state()
152 dc->bytes_to_read == 0) { in datacopier_check_state()
154 datacopier_callback(egc, dc, 0, 0, 0); in datacopier_check_state()
158 libxl__ev_fd_deregister(gc, &dc->towrite); in datacopier_check_state()
162 void libxl__datacopier_prefixdata(libxl__egc *egc, libxl__datacopier_state *dc, in libxl__datacopier_prefixdata() argument
177 assert(len < dc->maxsz - dc->used); in libxl__datacopier_prefixdata()
184 dc->used += buf->used; in libxl__datacopier_prefixdata()
185 LIBXL_TAILQ_INSERT_TAIL(&dc->bufs, buf, entry); in libxl__datacopier_prefixdata()
190 libxl__datacopier_state *dc, in datacopier_pollhup_handled() argument
193 STATE_AO_GC(dc->ao); in datacopier_pollhup_handled()
195 if (dc->callback_pollhup && (revents & POLLHUP)) { in datacopier_pollhup_handled()
197 fd, onwrite ? dc->writewhat : dc->readwhat, dc->copywhat); in datacopier_pollhup_handled()
198 libxl__datacopier_kill(dc); in datacopier_pollhup_handled()
199 dc->callback_pollhup(egc, dc, ERROR_FAIL, onwrite, -1); in datacopier_pollhup_handled()
208 libxl__datacopier_state *dc = CONTAINER_OF(abrt, *dc, abrt); in datacopier_abort() local
209 STATE_AO_GC(dc->ao); in datacopier_abort()
211 datacopier_callback(egc, dc, rc, -1, 0); in datacopier_abort()
216 libxl__datacopier_state *dc = CONTAINER_OF(ev, *dc, toread); in datacopier_readable() local
217 STATE_AO_GC(dc->ao); in datacopier_readable()
219 if (datacopier_pollhup_handled(egc, dc, fd, revents, 0)) in datacopier_readable()
225 revents, fd, dc->readwhat, dc->copywhat); in datacopier_readable()
226 datacopier_callback(egc, dc, ERROR_FAIL, -1, EIO); in datacopier_readable()
234 if (dc->readbuf) { in datacopier_readable()
235 r = read(ev->fd, dc->readbuf + dc->used, dc->bytes_to_read); in datacopier_readable()
237 while (dc->used >= dc->maxsz) { in datacopier_readable()
238 libxl__datacopier_buf *rm = LIBXL_TAILQ_FIRST(&dc->bufs); in datacopier_readable()
239 dc->used -= rm->used; in datacopier_readable()
240 assert(dc->used >= 0); in datacopier_readable()
241 LIBXL_TAILQ_REMOVE(&dc->bufs, rm, entry); in datacopier_readable()
245 buf = LIBXL_TAILQ_LAST(&dc->bufs, libxl__datacopier_bufs); in datacopier_readable()
249 LIBXL_TAILQ_INSERT_TAIL(&dc->bufs, buf, entry); in datacopier_readable()
253 (dc->bytes_to_read == -1) ? SIZE_MAX : dc->bytes_to_read)); in datacopier_readable()
263 dc->readwhat, dc->copywhat); in datacopier_readable()
264 datacopier_callback(egc, dc, ERROR_FAIL, -1, 0); in datacopier_readable()
270 dc->readwhat, dc->copywhat); in datacopier_readable()
271 datacopier_callback(egc, dc, ERROR_FAIL, 0, errno); in datacopier_readable()
275 if (dc->callback_pollhup) { in datacopier_readable()
288 if (datacopier_pollhup_handled(egc, dc, fd, hupchk.revents, 0)) in datacopier_readable()
291 libxl__ev_fd_deregister(gc, &dc->toread); in datacopier_readable()
294 if (dc->log) { in datacopier_readable()
295 int wrote = fwrite(buf->buf + buf->used, 1, r, dc->log); in datacopier_readable()
297 assert(ferror(dc->log)); in datacopier_readable()
299 LOGE(ERROR, "error logging %s", dc->copywhat); in datacopier_readable()
300 datacopier_callback(egc, dc, ERROR_FAIL, 0, errno); in datacopier_readable()
304 if (!dc->readbuf) { in datacopier_readable()
308 dc->used += r; in datacopier_readable()
309 if (dc->bytes_to_read > 0) in datacopier_readable()
310 dc->bytes_to_read -= r; in datacopier_readable()
311 if (dc->bytes_to_read == 0) in datacopier_readable()
314 datacopier_check_state(egc, dc); in datacopier_readable()
319 libxl__datacopier_state *dc = CONTAINER_OF(ev, *dc, towrite); in datacopier_writable() local
320 STATE_AO_GC(dc->ao); in datacopier_writable()
322 if (datacopier_pollhup_handled(egc, dc, fd, revents, 1)) in datacopier_writable()
328 revents, fd, dc->writewhat, dc->copywhat); in datacopier_writable()
329 datacopier_callback(egc, dc, ERROR_FAIL, -1, EIO); in datacopier_writable()
334 libxl__datacopier_buf *buf = LIBXL_TAILQ_FIRST(&dc->bufs); in datacopier_writable()
338 LIBXL_TAILQ_REMOVE(&dc->bufs, buf, entry); in datacopier_writable()
348 dc->writewhat, dc->copywhat); in datacopier_writable()
349 datacopier_callback(egc, dc, ERROR_FAIL, 1, errno); in datacopier_writable()
355 dc->used -= r; in datacopier_writable()
356 assert(dc->used >= 0); in datacopier_writable()
359 datacopier_check_state(egc, dc); in datacopier_writable()
362 int libxl__datacopier_start(libxl__datacopier_state *dc) in libxl__datacopier_start() argument
365 STATE_AO_GC(dc->ao); in libxl__datacopier_start()
367 libxl__datacopier_init(dc); in libxl__datacopier_start()
369 assert(dc->readfd >= 0 || dc->writefd >= 0); in libxl__datacopier_start()
370 assert(!(dc->readbuf && dc->bytes_to_read == -1)); in libxl__datacopier_start()
372 dc->abrt.ao = ao; in libxl__datacopier_start()
373 dc->abrt.callback = datacopier_abort; in libxl__datacopier_start()
374 rc = libxl__ao_abortable_register(&dc->abrt); in libxl__datacopier_start()
377 if (dc->readfd >= 0) { in libxl__datacopier_start()
378 rc = libxl__ev_fd_register(gc, &dc->toread, datacopier_readable, in libxl__datacopier_start()
379 dc->readfd, POLLIN); in libxl__datacopier_start()
383 if (dc->writefd >= 0) { in libxl__datacopier_start()
384 rc = libxl__ev_fd_register(gc, &dc->towrite, datacopier_writable, in libxl__datacopier_start()
385 dc->writefd, POLLOUT); in libxl__datacopier_start()
392 libxl__datacopier_kill(dc); in libxl__datacopier_start()