All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jan Kiszka <jan.kiszka@web.de>
To: Gerd Hoffmann <kraxel@redhat.com>
Cc: qemu-devel@nongnu.org
Subject: [Qemu-devel] Re: [PATCH 22/23] monitor: fix muxing
Date: Wed, 09 Sep 2009 21:51:58 +0200	[thread overview]
Message-ID: <4AA8075E.2090102@web.de> (raw)
In-Reply-To: <1252339585-27797-23-git-send-email-kraxel@redhat.com>

[-- Attachment #1: Type: text/plain, Size: 3881 bytes --]

Gerd Hoffmann wrote:
> make the mux driver send mux_in and mux_out events when switching
> focus while hooking up more handlers.
> 
> stop using CharDriverState->focus in monitor.c, track state using
> the mux events instead.  This also removes the implicit assumtion
> that a muxed monitor allways has mux channel 0.

Nice patch in the right direction, but it comes with a regression: When
you enable the monitor on mux'ed stdio via CTRL-A C, you don't get a
prompt until pressing some key.

> 
> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
> ---
>  monitor.c   |   33 ++++++++++++++++++++++-----------
>  qemu-char.c |    3 +++
>  2 files changed, 25 insertions(+), 11 deletions(-)
> 
> diff --git a/monitor.c b/monitor.c
> index f5f4d0e..edf48f3 100644
> --- a/monitor.c
> +++ b/monitor.c
> @@ -85,6 +85,8 @@ struct mon_fd_t {
>  
>  struct Monitor {
>      CharDriverState *chr;
> +    int mux_out;
> +    int reset_seen;
>      int flags;
>      int suspend_cnt;
>      uint8_t outbuf[1024];
> @@ -129,7 +131,7 @@ static int monitor_read_password(Monitor *mon, ReadLineFunc *readline_func,
>  
>  void monitor_flush(Monitor *mon)
>  {
> -    if (mon && mon->outbuf_index != 0 && mon->chr->focus == 0) {
> +    if (mon && mon->outbuf_index != 0 && !mon->mux_out) {
>          qemu_chr_write(mon->chr, mon->outbuf, mon->outbuf_index);
>          mon->outbuf_index = 0;
>      }
> @@ -3111,23 +3113,34 @@ static void monitor_event(void *opaque, int event)
>  
>      switch (event) {
>      case CHR_EVENT_MUX_IN:
> -        readline_restart(mon->rs);
> -        monitor_resume(mon);
> -        monitor_flush(mon);
> +        if (mon->reset_seen) {
> +            readline_restart(mon->rs);
> +            monitor_resume(mon);
> +            monitor_flush(mon);
> +        } else {
> +            mon->suspend_cnt = 0;
> +        }
> +        mon->mux_out = 0;
>          break;
>  
>      case CHR_EVENT_MUX_OUT:
> -        if (mon->suspend_cnt == 0)
> -            monitor_printf(mon, "\n");
> -        monitor_flush(mon);
> -        monitor_suspend(mon);
> +        if (mon->reset_seen) {
> +            if (mon->suspend_cnt == 0)
> +                monitor_printf(mon, "\n");
> +            monitor_flush(mon);
> +            monitor_suspend(mon);
> +        } else {
> +            mon->suspend_cnt++;
> +        }
> +        mon->mux_out = 1;
>          break;
>  
>      case CHR_EVENT_RESET:
>          monitor_printf(mon, "QEMU %s monitor - type 'help' for more "
>                         "information\n", QEMU_VERSION);
> -        if (mon->chr->focus == 0)
> +        if (!mon->mux_out)
>              readline_show_prompt(mon->rs);

Please add braces at this chance.

> +        mon->reset_seen = 1;
>          break;
>      }
>  }
> @@ -3155,8 +3168,6 @@ void monitor_init(CharDriverState *chr, int flags)
>  
>      mon->chr = chr;
>      mon->flags = flags;
> -    if (mon->chr->focus != 0)
> -        mon->suspend_cnt = 1; /* mux'ed monitors start suspended */
>      if (flags & MONITOR_USE_READLINE) {
>          mon->rs = readline_init(mon, monitor_find_completion);
>          monitor_read_command(mon, 0);
> diff --git a/qemu-char.c b/qemu-char.c
> index 2e71038..daa8587 100644
> --- a/qemu-char.c
> +++ b/qemu-char.c
> @@ -456,8 +456,11 @@ static void mux_chr_update_read_handler(CharDriverState *chr)
>          qemu_chr_add_handlers(d->drv, mux_chr_can_read, mux_chr_read,
>                                mux_chr_event, chr);
>      }
> +    if (-1 != chr->focus)
> +        mux_chr_send_event(d, chr->focus, CHR_EVENT_MUX_OUT);

{ }

>      chr->focus = d->mux_cnt;
>      d->mux_cnt++;
> +    mux_chr_send_event(d, chr->focus, CHR_EVENT_MUX_IN);
>  }
>  
>  static CharDriverState *qemu_chr_open_mux(CharDriverState *drv)

Jan


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 257 bytes --]

  reply	other threads:[~2009-09-09 19:51 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-09-07 16:06 [Qemu-devel] [PATCH 00/23] switch sockets+chardev to QemuOpts Gerd Hoffmann
2009-09-07 16:06 ` [Qemu-devel] [PATCH 01/23] QemuOpts: split option parser into two functions Gerd Hoffmann
2009-09-07 16:06 ` [Qemu-devel] [PATCH 02/23] qemu-option.h include protectors Gerd Hoffmann
2009-09-07 16:06 ` [Qemu-devel] [PATCH 03/23] switch chardev to QemuOpts: infrastructure, null device Gerd Hoffmann
2009-09-07 16:52   ` Blue Swirl
2009-09-07 16:06 ` [Qemu-devel] [PATCH 04/23] convert file+pipe chardevs to QemuOpts Gerd Hoffmann
2009-09-07 16:06 ` [Qemu-devel] [PATCH 05/23] sockets: add unix_connect_opts Gerd Hoffmann
2009-09-07 16:06 ` [Qemu-devel] [PATCH 06/23] sockets: add unix_listen_opts Gerd Hoffmann
2009-09-07 16:06 ` [Qemu-devel] [PATCH 07/23] sockets: add unix_*_opts for windows Gerd Hoffmann
2009-09-07 16:06 ` [Qemu-devel] [PATCH 08/23] sockets: add inet_connect_opts Gerd Hoffmann
2009-09-07 16:06 ` [Qemu-devel] [PATCH 09/23] sockets: add inet_listen_opts Gerd Hoffmann
2009-09-07 16:06 ` [Qemu-devel] [PATCH 10/23] convert unix+tcp chardevs to QemuOpts Gerd Hoffmann
2009-09-07 16:06 ` [Qemu-devel] [PATCH 11/23] convert pty chardev " Gerd Hoffmann
2009-09-07 16:06 ` [Qemu-devel] [PATCH 12/23] convert stdio " Gerd Hoffmann
2009-09-07 16:06 ` [Qemu-devel] [PATCH 13/23] convert msmouse " Gerd Hoffmann
2009-09-07 16:06 ` [Qemu-devel] [PATCH 14/23] convert braille " Gerd Hoffmann
2009-09-07 16:06 ` [Qemu-devel] [PATCH 15/23] convert windows console " Gerd Hoffmann
2009-09-07 16:06 ` [Qemu-devel] [PATCH 16/23] convert tty + parport chardevs " Gerd Hoffmann
2009-09-07 16:06 ` [Qemu-devel] [PATCH 17/23] convert vc chardev " Gerd Hoffmann
2009-09-07 16:06 ` [Qemu-devel] [PATCH 18/23] convert mux " Gerd Hoffmann
2009-09-07 16:06 ` [Qemu-devel] [PATCH 19/23] convert udp " Gerd Hoffmann
2009-09-09 20:27   ` [Qemu-devel] " Gerd Hoffmann
2009-09-07 16:06 ` [Qemu-devel] [PATCH 20/23] Allow -serial chardev:<name> Gerd Hoffmann
2009-09-07 16:06 ` [Qemu-devel] [PATCH 21/23] qdev: add parser for chardev properties Gerd Hoffmann
2009-09-07 16:06 ` [Qemu-devel] [PATCH 22/23] monitor: fix muxing Gerd Hoffmann
2009-09-09 19:51   ` Jan Kiszka [this message]
2009-09-09 20:18     ` [Qemu-devel] " Gerd Hoffmann
2009-09-09 20:27       ` Jan Kiszka
2009-09-07 16:06 ` [Qemu-devel] [PATCH 23/23] move mux focus field from CharDriverState to MuxDriver Gerd Hoffmann

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=4AA8075E.2090102@web.de \
    --to=jan.kiszka@web.de \
    --cc=kraxel@redhat.com \
    --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 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.