diff options
| author | Werner de Carne <werner@carne.de> | 2023-08-07 22:14:43 +0200 |
|---|---|---|
| committer | Marc-André Lureau <marcandre.lureau@redhat.com> | 2026-04-22 12:45:13 +0400 |
| commit | 7437b3eab6af1d31bb7fdfb3ac4e0a4de6ada50b (patch) | |
| tree | ce3236765821ef8ad71da059fe0403f8b6a40ca1 /chardev | |
| parent | 52cf667ed2285aa2d08db6abed46cdba5c14f9aa (diff) | |
| download | qemu-7437b3eab6af1d31bb7fdfb3ac4e0a4de6ada50b.tar.gz qemu-7437b3eab6af1d31bb7fdfb3ac4e0a4de6ada50b.zip | |
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>
Diffstat (limited to 'chardev')
| -rw-r--r-- | chardev/char-win.c | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/chardev/char-win.c b/chardev/char-win.c index fef45e83aa..e194242c9f 100644 --- a/chardev/char-win.c +++ b/chardev/char-win.c @@ -28,7 +28,7 @@ #include "qapi/error.h" #include "chardev/char-win.h" -static void win_chr_read(Chardev *chr, DWORD len) +static int win_chr_read(Chardev *chr, DWORD len) { WinChardev *s = WIN_CHARDEV(chr); int max_size = qemu_chr_be_can_write(chr); @@ -40,7 +40,7 @@ static void win_chr_read(Chardev *chr, DWORD len) len = max_size; } if (len == 0) { - return; + return 0; } ZeroMemory(&s->orecv, sizeof(s->orecv)); @@ -56,6 +56,8 @@ static void win_chr_read(Chardev *chr, DWORD len) if (size > 0) { qemu_chr_be_write(chr, buf, size); } + + return size > 0 ? 1 : 0; } static int win_chr_serial_poll(void *opaque) @@ -67,8 +69,9 @@ static int win_chr_serial_poll(void *opaque) ClearCommError(s->file, &comerr, &status); if (status.cbInQue > 0) { - win_chr_read(chr, status.cbInQue); - return 1; + if (win_chr_read(chr, status.cbInQue)) { + return 1; + } } return 0; } @@ -147,8 +150,9 @@ int win_chr_pipe_poll(void *opaque) PeekNamedPipe(s->file, NULL, 0, NULL, &size, NULL); if (size > 0) { - win_chr_read(chr, size); - return 1; + if (win_chr_read(chr, size)) { + return 1; + } } return 0; } |
