All of lore.kernel.org
 help / color / mirror / Atom feed
From: Kirill Batuzov <batuzovk@ispras.ru>
To: qemu-devel@nongnu.org
Cc: Nikita Belov <zodiac@ispras.ru>,
	Antonios Motakis <a.motakis@virtualopensystems.com>,
	"Michael S. Tsirkin" <mst@redhat.com>,
	Nikolay Nikolaev <n.nikolaev@virtualopensystems.com>,
	Kirill Batuzov <batuzovk@ispras.ru>
Subject: [Qemu-devel] [PATCH] Handle G_IO_HUP in tcp_chr_read for tcp chardev
Date: Tue,  1 Jul 2014 15:52:32 +0400	[thread overview]
Message-ID: <1404215552-12962-1-git-send-email-batuzovk@ispras.ru> (raw)
In-Reply-To: <20140527120423.15172.36698.stgit@3820>

Due to GLib limitations it is not possible to create several watches on one
channel on Windows hosts. See bug #338943 in GNOME bugzilla for details:
https://bugzilla.gnome.org/show_bug.cgi?id=338943

Handle G_IO_HUP in tcp_chr_read. It is already watched by corresponding watch.
Also remove the second watch with its handler.

This reverts commit cdaa86a54b232572bba594bf87a7416e527e460c.
("Add G_IO_HUP handler for socket chardev") but keeps its functionality.

Cc: Antonios Motakis <a.motakis@virtualopensystems.com>
Cc: Nikolay Nikolaev <n.nikolaev@virtualopensystems.com>
Cc: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Kirill Batuzov <batuzovk@ispras.ru>
Signed-off-by: Nikita Belov <zodiac@ispras.ru>
---

GLib limitation resulted in a bug on Windows host. Steps to reproduce:

Start qemu: qemu-system-i386 -qmp tcp:127.0.0.1:4444:server:nowait
Connect with telnet: telnet 127.0.0.1 4444
Try sending some data from telnet.
Expected result: answers from QEMU.
Observed result: no answers (actually tcp_chr_read is not called at all).

---
 include/sysemu/char.h |    1 -
 qemu-char.c           |   27 ++++++---------------------
 2 files changed, 6 insertions(+), 22 deletions(-)

diff --git a/include/sysemu/char.h b/include/sysemu/char.h
index c8b15f9..0bbd631 100644
--- a/include/sysemu/char.h
+++ b/include/sysemu/char.h
@@ -84,7 +84,6 @@ struct CharDriverState {
     int avail_connections;
     int is_mux;
     guint fd_in_tag;
-    guint fd_hup_tag;
     QemuOpts *opts;
     QTAILQ_ENTRY(CharDriverState) next;
 };
diff --git a/qemu-char.c b/qemu-char.c
index 51917de..22a9777 100644
--- a/qemu-char.c
+++ b/qemu-char.c
@@ -2673,6 +2673,12 @@ static gboolean tcp_chr_read(GIOChannel *chan, GIOCondition cond, void *opaque)
     uint8_t buf[READ_BUF_LEN];
     int len, size;
 
+    if (cond & G_IO_HUP) {
+        /* connection closed */
+        tcp_chr_disconnect(chr);
+        return TRUE;
+    }
+
     if (!s->connected || s->max_size <= 0) {
         return TRUE;
     }
@@ -2724,25 +2730,6 @@ CharDriverState *qemu_chr_open_eventfd(int eventfd)
 }
 #endif
 
-static gboolean tcp_chr_chan_close(GIOChannel *channel, GIOCondition cond,
-                                   void *opaque)
-{
-    CharDriverState *chr = opaque;
-
-    if (cond != G_IO_HUP) {
-        return FALSE;
-    }
-
-    /* connection closed */
-    tcp_chr_disconnect(chr);
-    if (chr->fd_hup_tag) {
-        g_source_remove(chr->fd_hup_tag);
-        chr->fd_hup_tag = 0;
-    }
-
-    return TRUE;
-}
-
 static void tcp_chr_connect(void *opaque)
 {
     CharDriverState *chr = opaque;
@@ -2752,8 +2739,6 @@ static void tcp_chr_connect(void *opaque)
     if (s->chan) {
         chr->fd_in_tag = io_add_watch_poll(s->chan, tcp_chr_read_poll,
                                            tcp_chr_read, chr);
-        chr->fd_hup_tag = g_io_add_watch(s->chan, G_IO_HUP, tcp_chr_chan_close,
-                                         chr);
     }
     qemu_chr_be_generic_open(chr);
 }
-- 
1.7.10.4

       reply	other threads:[~2014-07-01 11:52 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20140527120423.15172.36698.stgit@3820>
2014-07-01 11:52 ` Kirill Batuzov [this message]
2014-07-01 12:04   ` [Qemu-devel] [PATCH] Handle G_IO_HUP in tcp_chr_read for tcp chardev Paolo Bonzini
2014-07-01 12:37     ` Michael S. Tsirkin
2014-07-01 12:41   ` Michael S. Tsirkin
2014-07-01 13:29   ` Alex Bennée
2014-07-01 13:54     ` Kirill Batuzov
2014-07-07 18:41   ` Nikolay Nikolaev
2014-07-08 10:18     ` Kirill Batuzov

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=1404215552-12962-1-git-send-email-batuzovk@ispras.ru \
    --to=batuzovk@ispras.ru \
    --cc=a.motakis@virtualopensystems.com \
    --cc=mst@redhat.com \
    --cc=n.nikolaev@virtualopensystems.com \
    --cc=qemu-devel@nongnu.org \
    --cc=zodiac@ispras.ru \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.