From: Amit Shah <amit.shah@redhat.com>
To: qemu list <qemu-devel@nongnu.org>
Cc: Amit Shah <amit.shah@redhat.com>,
Anthony Liguori <aliguori@us.ibm.com>,
Anthony Liguori <anthony@codemonkey.ws>
Subject: [Qemu-devel] [PATCH 06/20] qemu-char: convert UDP to GIOChannel
Date: Tue, 5 Mar 2013 23:21:21 +0530 [thread overview]
Message-ID: <775a2bd666a3d1fa008656bf97191b7573c6ffb5.1362505276.git.amit.shah@redhat.com> (raw)
In-Reply-To: <cover.1362505276.git.amit.shah@redhat.com>
In-Reply-To: <cover.1362505276.git.amit.shah@redhat.com>
From: Anthony Liguori <aliguori@us.ibm.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Signed-off-by: Amit Shah <amit.shah@redhat.com>
---
qemu-char.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++----------
1 file changed, 57 insertions(+), 11 deletions(-)
diff --git a/qemu-char.c b/qemu-char.c
index 64b95d7..94ff332 100644
--- a/qemu-char.c
+++ b/qemu-char.c
@@ -654,6 +654,26 @@ static GIOChannel *io_channel_from_fd(int fd)
return chan;
}
+static GIOChannel *io_channel_from_socket(int fd)
+{
+ GIOChannel *chan;
+
+ if (fd == -1) {
+ return NULL;
+ }
+
+#ifdef _WIN32
+ chan = g_io_channel_win32_new_socket(fd);
+#else
+ chan = g_io_channel_unix_new(fd);
+#endif
+
+ g_io_channel_set_encoding(chan, NULL, NULL);
+ g_io_channel_set_buffered(chan, FALSE);
+
+ return chan;
+}
+
static int io_channel_send_all(GIOChannel *fd, const void *_buf, int len1)
{
GIOStatus status;
@@ -2126,6 +2146,8 @@ static CharDriverState *qemu_chr_open_win_stdio(QemuOpts *opts)
typedef struct {
int fd;
+ GIOChannel *chan;
+ guint tag;
uint8_t buf[READ_BUF_LEN];
int bufcnt;
int bufptr;
@@ -2135,8 +2157,17 @@ typedef struct {
static int udp_chr_write(CharDriverState *chr, const uint8_t *buf, int len)
{
NetCharDriver *s = chr->opaque;
+ gsize bytes_written;
+ GIOStatus status;
+
+ status = g_io_channel_write_chars(s->chan, (const gchar *)buf, len, &bytes_written, NULL);
+ if (status == G_IO_STATUS_EOF) {
+ return 0;
+ } else if (status != G_IO_STATUS_NORMAL) {
+ return -1;
+ }
- return send(s->fd, (const void *)buf, len, 0);
+ return bytes_written;
}
static int udp_chr_read_poll(void *opaque)
@@ -2157,17 +2188,22 @@ static int udp_chr_read_poll(void *opaque)
return s->max_size;
}
-static void udp_chr_read(void *opaque)
+static gboolean udp_chr_read(GIOChannel *chan, GIOCondition cond, void *opaque)
{
CharDriverState *chr = opaque;
NetCharDriver *s = chr->opaque;
+ gsize bytes_read = 0;
+ GIOStatus status;
if (s->max_size == 0)
- return;
- s->bufcnt = qemu_recv(s->fd, s->buf, sizeof(s->buf), 0);
+ return FALSE;
+ status = g_io_channel_read_chars(s->chan, (gchar *)s->buf, sizeof(s->buf),
+ &bytes_read, NULL);
+ s->bufcnt = bytes_read;
s->bufptr = s->bufcnt;
- if (s->bufcnt <= 0)
- return;
+ if (status != G_IO_STATUS_NORMAL) {
+ return FALSE;
+ }
s->bufptr = 0;
while (s->max_size > 0 && s->bufptr < s->bufcnt) {
@@ -2175,23 +2211,32 @@ static void udp_chr_read(void *opaque)
s->bufptr++;
s->max_size = qemu_chr_be_can_write(chr);
}
+
+ return TRUE;
}
static void udp_chr_update_read_handler(CharDriverState *chr)
{
NetCharDriver *s = chr->opaque;
- if (s->fd >= 0) {
- qemu_set_fd_handler2(s->fd, udp_chr_read_poll,
- udp_chr_read, NULL, chr);
+ if (s->tag) {
+ g_source_remove(s->tag);
+ s->tag = 0;
+ }
+
+ if (s->chan) {
+ s->tag = io_add_watch_poll(s->chan, udp_chr_read_poll, udp_chr_read, chr);
}
}
static void udp_chr_close(CharDriverState *chr)
{
NetCharDriver *s = chr->opaque;
- if (s->fd >= 0) {
- qemu_set_fd_handler2(s->fd, NULL, NULL, NULL, NULL);
+ if (s->tag) {
+ g_source_remove(s->tag);
+ }
+ if (s->chan) {
+ g_io_channel_unref(s->chan);
closesocket(s->fd);
}
g_free(s);
@@ -2214,6 +2259,7 @@ static CharDriverState *qemu_chr_open_udp(QemuOpts *opts)
}
s->fd = fd;
+ s->chan = io_channel_from_socket(s->fd);
s->bufcnt = 0;
s->bufptr = 0;
chr->opaque = s;
--
1.8.1.2
next prev parent reply other threads:[~2013-03-05 17:53 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-03-05 17:51 [Qemu-devel] [PATCH 00/20] chardev flow control Amit Shah
2013-03-05 17:51 ` [Qemu-devel] [PATCH 01/20] char-socket: fix error reporting Amit Shah
2013-03-05 17:51 ` [Qemu-devel] [PATCH 02/20] qemu-char: remove dead/confusing logic with nb_stdio_clients Amit Shah
2013-03-05 17:51 ` [Qemu-devel] [PATCH 03/20] char: add IOWatchPoll support Amit Shah
2013-03-29 9:53 ` Amit Shah
2013-03-29 12:24 ` Anthony Liguori
2013-03-29 12:42 ` Amit Shah
2013-03-29 14:03 ` Anthony Liguori
2013-03-29 16:08 ` Amit Shah
2013-03-05 17:51 ` [Qemu-devel] [PATCH 04/20] qemu-char: convert fd_chr to use a GIOChannel Amit Shah
2013-03-05 17:51 ` [Qemu-devel] [PATCH 05/20] qemu-char: convert pty to GIOChannel Amit Shah
2013-03-05 17:51 ` Amit Shah [this message]
2013-03-05 17:51 ` [Qemu-devel] [PATCH 07/20] qemu-char: tcp: make use GIOChannel Amit Shah
2013-03-05 17:51 ` [Qemu-devel] [PATCH 08/20] qemu-char: add watch support Amit Shah
2013-03-05 17:51 ` [Qemu-devel] [PATCH 09/20] qemu-char: add pty watch Amit Shah
2013-03-05 17:51 ` [Qemu-devel] [PATCH 10/20] char: add gio watch fn for tcp backends Amit Shah
2013-03-05 17:51 ` [Qemu-devel] [PATCH 11/20] qemu-char: use a glib timeout instead of qemu-timer Amit Shah
2013-03-15 15:06 ` Laurent Desnogues
2013-03-15 15:44 ` Anthony Liguori
2013-03-15 16:19 ` Laurent Desnogues
2013-03-25 9:38 ` Stefan Hajnoczi
2013-03-05 17:51 ` [Qemu-devel] [PATCH 12/20] qemu-char: remove use of QEMUTimer in favor of glib idle function Amit Shah
2013-03-05 17:51 ` [Qemu-devel] [PATCH 13/20] qemu-char: make char drivers dynamically registerable Amit Shah
2013-03-05 17:51 ` [Qemu-devel] [PATCH 14/20] qemu-char: move spice registration to spice-qemu-char.c Amit Shah
2013-03-05 17:51 ` [Qemu-devel] [PATCH 15/20] qemu-char: move baum registration to baum.c Amit Shah
2013-03-05 17:51 ` [Qemu-devel] [PATCH 16/20] qemu-char: move msmouse registeration to msmouse.c Amit Shah
2013-03-05 17:51 ` [Qemu-devel] [PATCH 17/20] qemu-char: move text console init to console.c Amit Shah
2013-03-13 17:19 ` Anthony Liguori
2013-03-05 17:51 ` [Qemu-devel] [PATCH 18/20] serial: add flow control to transmit Amit Shah
2013-03-05 17:51 ` [Qemu-devel] [PATCH 19/20] virtio: console: add flow control Amit Shah
2013-03-05 17:51 ` [Qemu-devel] [PATCH 20/20] virtio-serial: make flow control explicit in virtio-console Amit Shah
2013-03-12 2:02 ` [Qemu-devel] [PATCH 00/20] chardev flow control Anthony Liguori
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=775a2bd666a3d1fa008656bf97191b7573c6ffb5.1362505276.git.amit.shah@redhat.com \
--to=amit.shah@redhat.com \
--cc=aliguori@us.ibm.com \
--cc=anthony@codemonkey.ws \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).