ssize_t qio_channel_write(QIOChannel *ioc, const char *buf, size_t buflen, Error **errp) { struct iovec iov = { .iov_base = (char *)buf, .iov_len = buflen }; return qio_channel_writev_full(ioc, &iov, 1, NULL, 0, errp); } int qio_channel_read_all_eof(QIOChannel *ioc, char *buf, size_t buflen, Error **errp) { struct iovec iov = { .iov_base = buf, .iov_len = buflen }; return qio_channel_readv_all_eof(ioc, &iov, 1, errp); } int qio_channel_read_all(QIOChannel *ioc, char *buf, size_t buflen, Error **errp) { struct iovec iov = { .iov_base = buf, .iov_len = buflen }; return qio_channel_readv_all(ioc, &iov, 1, errp); } int qio_channel_write_all(QIOChannel *ioc, const char *buf, size_t buflen, Error **errp) { struct iovec iov = { .iov_base = (char *)buf, .iov_len = buflen }; return qio_channel_writev_all(ioc, &iov, 1, errp); } int qio_channel_set_blocking(QIOChannel *ioc, bool enabled, Error **errp) { QIOChannelClass *klass = QIO_CHANNEL_GET_CLASS(ioc); return klass->io_set_blocking(ioc, enabled, errp); } int qio_channel_close(QIOChannel *ioc, Error **errp) { QIOChannelClass *klass = QIO_CHANNEL_GET_CLASS(ioc); return klass->io_close(ioc, errp); }
/* This thread receives all data using iovecs */ static gpointer test_io_thread_reader(gpointer opaque) { QIOChannelTest *data = opaque; qio_channel_set_blocking(data->dst, data->blocking, NULL); qio_channel_readv_all(data->dst, data->outputv, data->niov, &data->readerr); return NULL; }
static void nbd_co_receive_reply(NBDClientSession *s, NBDRequest *request, NBDReply *reply, QEMUIOVector *qiov) { int i = HANDLE_TO_INDEX(s, request->handle); /* Wait until we're woken up by nbd_read_reply_entry. */ s->requests[i].receiving = true; qemu_coroutine_yield(); s->requests[i].receiving = false; *reply = s->reply; if (reply->handle != request->handle || !s->ioc || s->quit) { reply->error = EIO; } else { if (qiov && reply->error == 0) { assert(request->len == iov_size(qiov->iov, qiov->niov)); if (qio_channel_readv_all(s->ioc, qiov->iov, qiov->niov, NULL) < 0) { reply->error = EIO; s->quit = true; } } /* Tell the read handler to read another header. */ s->reply.handle = 0; } s->requests[i].coroutine = NULL; /* Kick the read_reply_co to get the next reply. */ if (s->read_reply_co) { aio_co_wake(s->read_reply_co); } qemu_co_mutex_lock(&s->send_mutex); s->in_flight--; qemu_co_queue_next(&s->free_sema); qemu_co_mutex_unlock(&s->send_mutex); }