avoid losing chars in serial console

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1564 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
bellard 2005-09-03 15:28:58 +00:00
parent 1c213d1976
commit aa0bc6b68c

34
vl.c
View File

@ -1138,7 +1138,11 @@ CharDriverState *qemu_chr_open_fd(int fd_in, int fd_out)
#define TERM_ESCAPE 0x01 /* ctrl-a is used for escape */ #define TERM_ESCAPE 0x01 /* ctrl-a is used for escape */
#define TERM_FIFO_MAX_SIZE 1
static int term_got_escape, client_index; static int term_got_escape, client_index;
static uint8_t term_fifo[TERM_FIFO_MAX_SIZE];
int term_fifo_size;
void term_print_help(void) void term_print_help(void)
{ {
@ -1207,19 +1211,37 @@ static void stdio_received_byte(int ch)
chr = stdio_clients[client_index]; chr = stdio_clients[client_index];
s = chr->opaque; s = chr->opaque;
buf[0] = ch; if (s->fd_can_read(s->fd_opaque) > 0) {
/* XXX: should queue the char if the device is not buf[0] = ch;
ready */
if (s->fd_can_read(s->fd_opaque) > 0)
s->fd_read(s->fd_opaque, buf, 1); s->fd_read(s->fd_opaque, buf, 1);
} else if (term_fifo_size == 0) {
term_fifo[term_fifo_size++] = ch;
}
} }
} }
} }
static int stdio_can_read(void *opaque) static int stdio_can_read(void *opaque)
{ {
/* XXX: not strictly correct */ CharDriverState *chr;
return 1; FDCharDriver *s;
if (client_index < stdio_nb_clients) {
chr = stdio_clients[client_index];
s = chr->opaque;
/* try to flush the queue if needed */
if (term_fifo_size != 0 && s->fd_can_read(s->fd_opaque) > 0) {
s->fd_read(s->fd_opaque, term_fifo, 1);
term_fifo_size = 0;
}
/* see if we can absorb more chars */
if (term_fifo_size == 0)
return 1;
else
return 0;
} else {
return 1;
}
} }
static void stdio_read(void *opaque, const uint8_t *buf, int size) static void stdio_read(void *opaque, const uint8_t *buf, int size)