From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1KLalP-0000zR-FE for qemu-devel@nongnu.org; Wed, 23 Jul 2008 05:36:03 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1KLalM-0000z5-Tu for qemu-devel@nongnu.org; Wed, 23 Jul 2008 05:36:02 -0400 Received: from [199.232.76.173] (port=42340 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1KLalM-0000yy-NM for qemu-devel@nongnu.org; Wed, 23 Jul 2008 05:36:00 -0400 Received: from cantor.suse.de ([195.135.220.2]:41992 helo=mx1.suse.de) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1KLalM-0008UM-9G for qemu-devel@nongnu.org; Wed, 23 Jul 2008 05:36:00 -0400 Message-ID: <4886FB17.5080202@suse.de> Date: Wed, 23 Jul 2008 11:34:15 +0200 From: Kevin Wolf MIME-Version: 1.0 Subject: Re: [Qemu-devel] [PATCH 2/3] Always use nonblocking mode for qemu_chr_open_fd. References: <488688E3.105@codemonkey.ws> In-Reply-To: <488688E3.105@codemonkey.ws> Content-Type: multipart/mixed; boundary="------------030908010204060708010206" Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org This is a multi-part message in MIME format. --------------030908010204060708010206 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit 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 --------------030908010204060708010206 Content-Type: text/x-patch; name="nonblock.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="nonblock.patch" 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)) { --------------030908010204060708010206--