diff mbox series

[for,6.1] ui/gtk: retry sending VTE console input

Message ID 20210810063257.17411-1-vr_qemu@t-online.de
State New
Headers show
Series [for,6.1] ui/gtk: retry sending VTE console input | expand

Commit Message

Volker Rümelin Aug. 10, 2021, 6:32 a.m. UTC
Commit 584af1f1d9 ("ui/gtk: add a keyboard fifo to the VTE
consoles") changed the VTE chardev backend code to rely on the
chr_accept_input() callback function. The code expects a
chr_accept_input() call whenever qemu_chr_be_can_write() bytes
were written. It turns out this is wrong. Some chardev
frontends only call this callback after can_write was 0.

Change the code to send data until the keyboard fifo is empty
or qemu_chr_be_can_write() returns 0.

Fixes: 584af1f1d9 ("ui/gtk: add a keyboard fifo to the VTE consoles")
Signed-off-by: Volker Rümelin <vr_qemu@t-online.de>
---
 ui/gtk.c | 10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)

Comments

Marc-André Lureau Aug. 10, 2021, 8:16 a.m. UTC | #1
On Tue, Aug 10, 2021 at 10:35 AM Volker Rümelin <vr_qemu@t-online.de> wrote:

> Commit 584af1f1d9 ("ui/gtk: add a keyboard fifo to the VTE
> consoles") changed the VTE chardev backend code to rely on the
> chr_accept_input() callback function. The code expects a
> chr_accept_input() call whenever qemu_chr_be_can_write() bytes
> were written. It turns out this is wrong. Some chardev
> frontends only call this callback after can_write was 0.
>
> Change the code to send data until the keyboard fifo is empty
> or qemu_chr_be_can_write() returns 0.
>
> Fixes: 584af1f1d9 ("ui/gtk: add a keyboard fifo to the VTE consoles")
> Signed-off-by: Volker Rümelin <vr_qemu@t-online.de>
>

Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>

---
>  ui/gtk.c | 10 ++++------
>  1 file changed, 4 insertions(+), 6 deletions(-)
>
> diff --git a/ui/gtk.c b/ui/gtk.c
> index 974e4dfc0b..cfb0728d1f 100644
> --- a/ui/gtk.c
> +++ b/ui/gtk.c
> @@ -1646,16 +1646,14 @@ static void gd_vc_send_chars(VirtualConsole *vc)
>
>      len = qemu_chr_be_can_write(vc->vte.chr);
>      avail = fifo8_num_used(&vc->vte.out_fifo);
> -    if (len > avail) {
> -        len = avail;
> -    }
> -    while (len > 0) {
> +    while (len > 0 && avail > 0) {
>          const uint8_t *buf;
>          uint32_t size;
>
> -        buf = fifo8_pop_buf(&vc->vte.out_fifo, len, &size);
> +        buf = fifo8_pop_buf(&vc->vte.out_fifo, MIN(len, avail), &size);
>          qemu_chr_be_write(vc->vte.chr, (uint8_t *)buf, size);
> -        len -= size;
> +        len = qemu_chr_be_can_write(vc->vte.chr);
> +        avail -= size;
>      }
>  }
>
> --
> 2.26.2
>
>
Gerd Hoffmann Aug. 10, 2021, 8:55 a.m. UTC | #2
On Tue, Aug 10, 2021 at 08:32:57AM +0200, Volker Rümelin wrote:
> Commit 584af1f1d9 ("ui/gtk: add a keyboard fifo to the VTE
> consoles") changed the VTE chardev backend code to rely on the
> chr_accept_input() callback function. The code expects a
> chr_accept_input() call whenever qemu_chr_be_can_write() bytes
> were written. It turns out this is wrong. Some chardev
> frontends only call this callback after can_write was 0.
> 
> Change the code to send data until the keyboard fifo is empty
> or qemu_chr_be_can_write() returns 0.
> 
> Fixes: 584af1f1d9 ("ui/gtk: add a keyboard fifo to the VTE consoles")
> Signed-off-by: Volker Rümelin <vr_qemu@t-online.de>

Queued.

thanks,
  Gerd
diff mbox series

Patch

diff --git a/ui/gtk.c b/ui/gtk.c
index 974e4dfc0b..cfb0728d1f 100644
--- a/ui/gtk.c
+++ b/ui/gtk.c
@@ -1646,16 +1646,14 @@  static void gd_vc_send_chars(VirtualConsole *vc)
 
     len = qemu_chr_be_can_write(vc->vte.chr);
     avail = fifo8_num_used(&vc->vte.out_fifo);
-    if (len > avail) {
-        len = avail;
-    }
-    while (len > 0) {
+    while (len > 0 && avail > 0) {
         const uint8_t *buf;
         uint32_t size;
 
-        buf = fifo8_pop_buf(&vc->vte.out_fifo, len, &size);
+        buf = fifo8_pop_buf(&vc->vte.out_fifo, MIN(len, avail), &size);
         qemu_chr_be_write(vc->vte.chr, (uint8_t *)buf, size);
-        len -= size;
+        len = qemu_chr_be_can_write(vc->vte.chr);
+        avail -= size;
     }
 }