[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 2/3] Always use nonblocking mode for qemu_chr_op
From: |
Kevin Wolf |
Subject: |
Re: [Qemu-devel] [PATCH 2/3] Always use nonblocking mode for qemu_chr_open_fd. |
Date: |
Wed, 23 Jul 2008 11:34:15 +0200 |
User-agent: |
Thunderbird 2.0.0.12 (X11/20071114) |
Anthony Liguori schrieb:
> This changes semantics a bit. Previously, using a pty would guarantee
> that data is always written as qemu_chr_write does not perform any sort
> of buffering.
>
> Now, that data will be silently dropped instead of causing QEMU to
> block. I don't think it's perfectly clear that one behaviour is clearly
> better than the other.
Then we need both.
Add an option to specify non-blocking mode for stdio, pty and pipe in
qemu_chr_open. Blocking mode is used by default (maintaining current
semantics), non-blocking mode if the name is prefixed with nonblock:
Signed-off-by: Kevin Wolf <address@hidden>
Index: vl.c
===================================================================
--- vl.c.orig
+++ vl.c
@@ -2227,11 +2227,16 @@ static void fd_chr_close(struct CharDriv
}
/* open a character device to a unix fd */
-static CharDriverState *qemu_chr_open_fd(int fd_in, int fd_out)
+static CharDriverState *qemu_chr_open_fd(int fd_in, int fd_out, int block)
{
CharDriverState *chr;
FDCharDriver *s;
+ if (!block) {
+ socket_set_nonblock(fd_in);
+ socket_set_nonblock(fd_out);
+ }
+
chr = qemu_mallocz(sizeof(CharDriverState));
if (!chr)
return NULL;
@@ -2259,10 +2264,10 @@ static CharDriverState *qemu_chr_open_fi
TFR(fd_out = open(file_out, O_WRONLY | O_TRUNC | O_CREAT | O_BINARY,
0666));
if (fd_out < 0)
return NULL;
- return qemu_chr_open_fd(-1, fd_out);
+ return qemu_chr_open_fd(-1, fd_out, 0);
}
-static CharDriverState *qemu_chr_open_pipe(const char *filename)
+static CharDriverState *qemu_chr_open_pipe(const char *filename, int block)
{
int fd_in, fd_out;
char filename_in[256], filename_out[256];
@@ -2280,7 +2285,7 @@ static CharDriverState *qemu_chr_open_pi
if (fd_in < 0)
return NULL;
}
- return qemu_chr_open_fd(fd_in, fd_out);
+ return qemu_chr_open_fd(fd_in, fd_out, block);
}
@@ -2376,13 +2381,13 @@ static void qemu_chr_close_stdio(struct
fd_chr_close(chr);
}
-static CharDriverState *qemu_chr_open_stdio(void)
+static CharDriverState *qemu_chr_open_stdio(int block)
{
CharDriverState *chr;
if (stdio_nb_clients >= STDIO_MAX_CLIENTS)
return NULL;
- chr = qemu_chr_open_fd(0, 1);
+ chr = qemu_chr_open_fd(0, 1, block);
chr->chr_close = qemu_chr_close_stdio;
qemu_set_fd_handler2(0, stdio_read_poll, stdio_read, NULL, chr);
stdio_nb_clients++;
@@ -2449,7 +2454,7 @@ void cfmakeraw (struct termios *termios_
#endif
#if defined(__linux__) || defined(__sun__)
-static CharDriverState *qemu_chr_open_pty(void)
+static CharDriverState *qemu_chr_open_pty(int block)
{
struct termios tty;
int master_fd, slave_fd;
@@ -2463,7 +2468,7 @@ static CharDriverState *qemu_chr_open_pt
tcsetattr(slave_fd, TCSAFLUSH, &tty);
fprintf(stderr, "char device redirected to %s\n", ptsname(master_fd));
- return qemu_chr_open_fd(master_fd, master_fd);
+ return qemu_chr_open_fd(master_fd, master_fd, block);
}
static void tty_serial_init(int fd, int speed,
@@ -2578,7 +2583,7 @@ static CharDriverState *qemu_chr_open_tt
TFR(fd = open(filename, O_RDWR | O_NONBLOCK));
tty_serial_init(fd, 115200, 'N', 8, 1);
- chr = qemu_chr_open_fd(fd, fd);
+ chr = qemu_chr_open_fd(fd, fd, 0);
if (!chr) {
close(fd);
return NULL;
@@ -2588,7 +2593,7 @@ static CharDriverState *qemu_chr_open_tt
return chr;
}
#else /* ! __linux__ && ! __sun__ */
-static CharDriverState *qemu_chr_open_pty(void)
+static CharDriverState *qemu_chr_open_pty(int block)
{
return NULL;
}
@@ -3582,6 +3587,10 @@ static CharDriverState *qemu_chr_open_tc
CharDriverState *qemu_chr_open(const char *filename)
{
const char *p;
+ int block = 1;
+
+ if (strstart(filename, "nonblock:", &filename))
+ block = 0;
if (!strcmp(filename, "vc")) {
return text_console_init(&display_state, 0);
@@ -3615,11 +3624,11 @@ CharDriverState *qemu_chr_open(const cha
} else if (strstart(filename, "file:", &p)) {
return qemu_chr_open_file_out(p);
} else if (strstart(filename, "pipe:", &p)) {
- return qemu_chr_open_pipe(p);
+ return qemu_chr_open_pipe(p, block);
} else if (!strcmp(filename, "pty")) {
- return qemu_chr_open_pty();
+ return qemu_chr_open_pty(block);
} else if (!strcmp(filename, "stdio")) {
- return qemu_chr_open_stdio();
+ return qemu_chr_open_stdio(block);
} else
#if defined(__linux__)
if (strstart(filename, "/dev/parport", NULL)) {
- Re: [Qemu-devel] [PATCH 2/3] Always use nonblocking mode for qemu_chr_open_fd., (continued)
- Re: [Qemu-devel] [PATCH 2/3] Always use nonblocking mode for qemu_chr_open_fd., Gerd Hoffmann, 2008/07/25
- Re: [Qemu-devel] [PATCH 2/3] Always use nonblocking mode for qemu_chr_open_fd., Jamie Lokier, 2008/07/25
- Re: [Qemu-devel] [PATCH 2/3] Always use nonblocking mode for qemu_chr_open_fd., Gerd Hoffmann, 2008/07/28
- Re: [Qemu-devel] [PATCH 2/3] Always use nonblocking mode for qemu_chr_open_fd., Jamie Lokier, 2008/07/28
- Re: [Qemu-devel] [PATCH 2/3] Always use nonblocking mode for qemu_chr_open_fd., Gerd Hoffmann, 2008/07/28
- [Qemu-devel] Re: [PATCH 2/3] Always use nonblocking mode for qemu_chr_open_fd., Anthony Liguori, 2008/07/24
- [Qemu-devel] Re: [PATCH 2/3] Always use nonblocking mode for qemu_chr_open_fd., Gerd Hoffmann, 2008/07/25
- [Qemu-devel] Re: [PATCH 2/3] Always use nonblocking mode for qemu_chr_open_fd., Anthony Liguori, 2008/07/25
- [Qemu-devel] Re: [PATCH 2/3] Always use nonblocking mode for qemu_chr_open_fd., Gerd Hoffmann, 2008/07/28
- [Qemu-devel] Re: [PATCH 2/3] Always use nonblocking mode for qemu_chr_open_fd., Anthony Liguori, 2008/07/28
Re: [Qemu-devel] [PATCH 2/3] Always use nonblocking mode for qemu_chr_open_fd.,
Kevin Wolf <=
Re: [Qemu-devel] [PATCH 2/3] Always use nonblocking mode for qemu_chr_open_fd., Gerd Hoffmann, 2008/07/23
Re: [Qemu-devel] [PATCH 2/3] Always use nonblocking mode for qemu_chr_open_fd., Paul Brook, 2008/07/23