[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH] chardev: fix parallel device can't be reconnect.
From: |
Peng Hao |
Subject: |
[Qemu-devel] [PATCH] chardev: fix parallel device can't be reconnect. |
Date: |
Tue, 11 Jul 2017 00:45:21 +0800 |
Parallel device don't register be->chr_can_read function, but remote disconnect
event is handled in chr_read.
So connected parallel device can not detect remote disconnect event.
Signed-off-by: Peng Hao <address@hidden>
Reviewed-by: Wang Yechao <address@hidden>
---
chardev/char-socket.c | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/chardev/char-socket.c b/chardev/char-socket.c
index ccc499c..59509d4 100644
--- a/chardev/char-socket.c
+++ b/chardev/char-socket.c
@@ -131,6 +131,14 @@ static int tcp_chr_write(Chardev *chr, const uint8_t *buf,
int len)
}
}
+static gboolean is_parallel_device(Chardev *chr)
+{
+ if (chr && chr->label && strstr(chr->label, "charparallel")) {
+ return TRUE;
+ }
+ return FALSE;
+}
+
static int tcp_chr_read_poll(void *opaque)
{
Chardev *chr = CHARDEV(opaque);
@@ -138,6 +146,8 @@ static int tcp_chr_read_poll(void *opaque)
if (!s->connected) {
return 0;
}
+ if (is_parallel_device(chr)) {
+ return 1;
+ }
s->max_size = qemu_chr_be_can_write(chr);
return s->max_size;
}
@@ -422,6 +432,15 @@ static gboolean tcp_chr_read(QIOChannel *chan,
GIOCondition cond, void *opaque)
uint8_t buf[CHR_READ_BUF_LEN];
int len, size;
+ /* for parallel-device handle the socket close event here*/
+ if (!s->max_size && is_parallel_device(chr)) {
+ size = tcp_chr_recv(chr, (void *)buf, CHR_READ_BUF_LEN);
+ if (size == 0 || size == -1) {
+ tcp_chr_disconnect(chr);
+ }
+ return TRUE;
+ }
+
if (!s->connected || s->max_size <= 0) {
return TRUE;
}
--
1.8.3.1
- [Qemu-devel] [PATCH] chardev: fix parallel device can't be reconnect.,
Peng Hao <=