All of lore.kernel.org
 help / color / mirror / Atom feed
From: Kirill Batuzov <batuzovk@ispras.ru>
To: Nikolay Nikolaev <n.nikolaev@virtualopensystems.com>
Cc: Antonios Motakis <a.motakis@virtualopensystems.com>,
	Nikita Belov <zodiac@ispras.ru>,
	qemu-devel <qemu-devel@nongnu.org>,
	"Michael S. Tsirkin" <mst@redhat.com>
Subject: Re: [Qemu-devel] [PATCH] Handle G_IO_HUP in tcp_chr_read for tcp chardev
Date: Tue, 8 Jul 2014 14:18:43 +0400 (MSK)	[thread overview]
Message-ID: <alpine.DEB.2.02.1407081414030.4137@bulbul.intra.ispras.ru> (raw)
In-Reply-To: <CADDJ2=N9iNn1ovGr+zQwp=hn1s0zT-4qNFs-rQcqsZpFwC7VRQ@mail.gmail.com>

On Mon, 7 Jul 2014, Nikolay Nikolaev wrote:

> On Tue, Jul 1, 2014 at 2:52 PM, Kirill Batuzov <batuzovk@ispras.ru> wrote:
> > 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.
> Shall this work when the connection is idle and the remote end closes it?
>

Yes, this should work. Why do you think it may not? The watch is
enabled, so tcp_chr_read will be called. During testing it handled
disconnects just fine.

> >
> > 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-08 10:18 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 ` [Qemu-devel] [PATCH] Handle G_IO_HUP in tcp_chr_read for tcp chardev Kirill Batuzov
2014-07-01 12:04   ` 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 [this message]

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=alpine.DEB.2.02.1407081414030.4137@bulbul.intra.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.