@samitouri / QOSamiQemu / commits / 7437b3eab6

serial COM: windows serial COM PollingFunc don't sleep

Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1802 Signed-off-by: Werner de Carne <werner@carne.de> [ Marc-André - indentation fixes ] Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com> Message-ID: <20230807201443.2668-1-werner@carne.de>

Werner de Carne committed Aug 7, 2023 at 22:14 UTC 7437b3eab6af1d31bb7fdfb3ac4e0a4de6ada50b
1 file changed +10 -6
chardev/char-win.c
+10 -6
@@ -28,7 +28,7 @@
28 #include "qapi/error.h"
29 #include "chardev/char-win.h"
30
31 -static void win_chr_read(Chardev *chr, DWORD len)
31 +static int win_chr_read(Chardev *chr, DWORD len)
32 {
33 WinChardev *s = WIN_CHARDEV(chr);
34 int max_size = qemu_chr_be_can_write(chr);
@@ -40,7 +40,7 @@ static void win_chr_read(Chardev *chr, DWORD len)
40 len = max_size;
41 }
42 if (len == 0) {
43 - return;
43 + return 0;
44 }
45
46 ZeroMemory(&s->orecv, sizeof(s->orecv));
@@ -56,6 +56,8 @@ static void win_chr_read(Chardev *chr, DWORD len)
56 if (size > 0) {
57 qemu_chr_be_write(chr, buf, size);
58 }
59 +
60 + return size > 0 ? 1 : 0;
61 }
62
63 static int win_chr_serial_poll(void *opaque)
@@ -67,8 +69,9 @@ static int win_chr_serial_poll(void *opaque)
69
70 ClearCommError(s->file, &comerr, &status);
71 if (status.cbInQue > 0) {
70 - win_chr_read(chr, status.cbInQue);
71 - return 1;
72 + if (win_chr_read(chr, status.cbInQue)) {
73 + return 1;
74 + }
75 }
76 return 0;
77 }
@@ -147,8 +150,9 @@ int win_chr_pipe_poll(void *opaque)
150
151 PeekNamedPipe(s->file, NULL, 0, NULL, &size, NULL);
152 if (size > 0) {
150 - win_chr_read(chr, size);
151 - return 1;
153 + if (win_chr_read(chr, size)) {
154 + return 1;
155 + }
156 }
157 return 0;
158 }