Commit e5b0bc445ed7edb1738aabb982a387ee38da1655
1 parent
dff5efc8
Rearrange char event handlers to fix CHR_EVENT_RESET.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2361 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
8 changed files
with
84 additions
and
136 deletions
console.c
| ... | ... | @@ -132,10 +132,7 @@ struct TextConsole { |
| 132 | 132 | int esc_params[MAX_ESC_PARAMS]; |
| 133 | 133 | int nb_esc_params; |
| 134 | 134 | |
| 135 | - /* kbd read handler */ | |
| 136 | - IOCanRWHandler *fd_can_read; | |
| 137 | - IOReadHandler *fd_read; | |
| 138 | - void *fd_opaque; | |
| 135 | + CharDriverState *chr; | |
| 139 | 136 | /* fifo for key pressed */ |
| 140 | 137 | QEMUFIFO out_fifo; |
| 141 | 138 | uint8_t out_fifo_buf[16]; |
| ... | ... | @@ -1021,16 +1018,6 @@ static int console_puts(CharDriverState *chr, const uint8_t *buf, int len) |
| 1021 | 1018 | return len; |
| 1022 | 1019 | } |
| 1023 | 1020 | |
| 1024 | -static void console_chr_add_read_handler(CharDriverState *chr, | |
| 1025 | - IOCanRWHandler *fd_can_read, | |
| 1026 | - IOReadHandler *fd_read, void *opaque) | |
| 1027 | -{ | |
| 1028 | - TextConsole *s = chr->opaque; | |
| 1029 | - s->fd_can_read = fd_can_read; | |
| 1030 | - s->fd_read = fd_read; | |
| 1031 | - s->fd_opaque = opaque; | |
| 1032 | -} | |
| 1033 | - | |
| 1034 | 1021 | static void console_send_event(CharDriverState *chr, int event) |
| 1035 | 1022 | { |
| 1036 | 1023 | TextConsole *s = chr->opaque; |
| ... | ... | @@ -1052,14 +1039,14 @@ static void kbd_send_chars(void *opaque) |
| 1052 | 1039 | int len; |
| 1053 | 1040 | uint8_t buf[16]; |
| 1054 | 1041 | |
| 1055 | - len = s->fd_can_read(s->fd_opaque); | |
| 1042 | + len = qemu_chr_can_read(s->chr); | |
| 1056 | 1043 | if (len > s->out_fifo.count) |
| 1057 | 1044 | len = s->out_fifo.count; |
| 1058 | 1045 | if (len > 0) { |
| 1059 | 1046 | if (len > sizeof(buf)) |
| 1060 | 1047 | len = sizeof(buf); |
| 1061 | 1048 | qemu_fifo_read(&s->out_fifo, buf, len); |
| 1062 | - s->fd_read(s->fd_opaque, buf, len); | |
| 1049 | + qemu_chr_read(s->chr, buf, len); | |
| 1063 | 1050 | } |
| 1064 | 1051 | /* characters are pending: we send them a bit later (XXX: |
| 1065 | 1052 | horrible, should change char device API) */ |
| ... | ... | @@ -1110,7 +1097,7 @@ void kbd_put_keysym(int keysym) |
| 1110 | 1097 | } else { |
| 1111 | 1098 | *q++ = keysym; |
| 1112 | 1099 | } |
| 1113 | - if (s->fd_read) { | |
| 1100 | + if (s->chr->chr_read) { | |
| 1114 | 1101 | qemu_fifo_write(&s->out_fifo, buf, q - buf); |
| 1115 | 1102 | kbd_send_chars(s); |
| 1116 | 1103 | } |
| ... | ... | @@ -1186,9 +1173,9 @@ CharDriverState *text_console_init(DisplayState *ds) |
| 1186 | 1173 | } |
| 1187 | 1174 | chr->opaque = s; |
| 1188 | 1175 | chr->chr_write = console_puts; |
| 1189 | - chr->chr_add_read_handler = console_chr_add_read_handler; | |
| 1190 | 1176 | chr->chr_send_event = console_send_event; |
| 1191 | 1177 | |
| 1178 | + s->chr = chr; | |
| 1192 | 1179 | s->out_fifo.buf = s->out_fifo_buf; |
| 1193 | 1180 | s->out_fifo.buf_size = sizeof(s->out_fifo_buf); |
| 1194 | 1181 | s->kbd_timer = qemu_new_timer(rt_clock, kbd_send_chars, s); | ... | ... |
hw/pl011.c
| ... | ... | @@ -243,8 +243,8 @@ void pl011_init(uint32_t base, void *pic, int irq, |
| 243 | 243 | s->cr = 0x300; |
| 244 | 244 | s->flags = 0x90; |
| 245 | 245 | if (chr){ |
| 246 | - qemu_chr_add_read_handler(chr, pl011_can_recieve, pl011_recieve, s); | |
| 247 | - qemu_chr_add_event_handler(chr, pl011_event); | |
| 246 | + qemu_chr_add_handlers(chr, pl011_can_recieve, pl011_recieve, | |
| 247 | + pl011_event, s); | |
| 248 | 248 | } |
| 249 | 249 | /* ??? Save/restore. */ |
| 250 | 250 | } | ... | ... |
hw/serial.c
| ... | ... | @@ -365,8 +365,8 @@ SerialState *serial_init(SetIRQFunc *set_irq, void *opaque, |
| 365 | 365 | register_ioport_write(base, 8, 1, serial_ioport_write, s); |
| 366 | 366 | register_ioport_read(base, 8, 1, serial_ioport_read, s); |
| 367 | 367 | s->chr = chr; |
| 368 | - qemu_chr_add_read_handler(chr, serial_can_receive1, serial_receive1, s); | |
| 369 | - qemu_chr_add_event_handler(chr, serial_event); | |
| 368 | + qemu_chr_add_handlers(chr, serial_can_receive1, serial_receive1, | |
| 369 | + serial_event, s); | |
| 370 | 370 | return s; |
| 371 | 371 | } |
| 372 | 372 | |
| ... | ... | @@ -453,7 +453,7 @@ SerialState *serial_mm_init (SetIRQFunc *set_irq, void *opaque, |
| 453 | 453 | serial_mm_write, s); |
| 454 | 454 | cpu_register_physical_memory(base, 8 << it_shift, s_io_memory); |
| 455 | 455 | s->chr = chr; |
| 456 | - qemu_chr_add_read_handler(chr, serial_can_receive1, serial_receive1, s); | |
| 457 | - qemu_chr_add_event_handler(chr, serial_event); | |
| 456 | + qemu_chr_add_handlers(chr, serial_can_receive1, serial_receive1, | |
| 457 | + serial_event, s); | |
| 458 | 458 | return s; |
| 459 | 459 | } | ... | ... |
hw/sh7750.c
| ... | ... | @@ -299,9 +299,8 @@ static void init_serial1(SH7750State * s, int serial_nb) |
| 299 | 299 | } |
| 300 | 300 | |
| 301 | 301 | s->serial1 = chr; |
| 302 | - qemu_chr_add_read_handler(chr, serial1_can_receive, | |
| 303 | - serial1_receive, s); | |
| 304 | - qemu_chr_add_event_handler(chr, serial1_event); | |
| 302 | + qemu_chr_add_handlers(chr, serial1_can_receive, | |
| 303 | + serial1_receive, serial1_event, s); | |
| 305 | 304 | } |
| 306 | 305 | |
| 307 | 306 | /********************************************************************** |
| ... | ... | @@ -415,9 +414,8 @@ static void init_serial2(SH7750State * s, int serial_nb) |
| 415 | 414 | } |
| 416 | 415 | |
| 417 | 416 | s->serial2 = chr; |
| 418 | - qemu_chr_add_read_handler(chr, serial2_can_receive, | |
| 419 | - serial2_receive, s); | |
| 420 | - qemu_chr_add_event_handler(chr, serial2_event); | |
| 417 | + qemu_chr_add_handlers(chr, serial2_can_receive, | |
| 418 | + serial2_receive, serial1_event, s); | |
| 421 | 419 | } |
| 422 | 420 | |
| 423 | 421 | static void init_serial_ports(SH7750State * s) | ... | ... |
hw/slavio_serial.c
| ... | ... | @@ -565,8 +565,8 @@ SerialState *slavio_serial_init(int base, int irq, CharDriverState *chr1, CharDr |
| 565 | 565 | s->chn[i].chn = 1 - i; |
| 566 | 566 | s->chn[i].type = ser; |
| 567 | 567 | if (s->chn[i].chr) { |
| 568 | - qemu_chr_add_read_handler(s->chn[i].chr, serial_can_receive, serial_receive1, &s->chn[i]); | |
| 569 | - qemu_chr_add_event_handler(s->chn[i].chr, serial_event); | |
| 568 | + qemu_chr_add_handlers(s->chn[i].chr, serial_can_receive, | |
| 569 | + serial_receive1, serial_event, &s->chn[i]); | |
| 570 | 570 | } |
| 571 | 571 | } |
| 572 | 572 | s->chn[0].otherchn = &s->chn[1]; | ... | ... |
monitor.c
| ... | ... | @@ -2455,8 +2455,7 @@ void monitor_init(CharDriverState *hd, int show_banner) |
| 2455 | 2455 | monitor_hd = hd; |
| 2456 | 2456 | hide_banner = !show_banner; |
| 2457 | 2457 | |
| 2458 | - qemu_chr_add_read_handler(hd, term_can_read, term_read, NULL); | |
| 2459 | - qemu_chr_add_event_handler(hd, term_event); | |
| 2458 | + qemu_chr_add_handlers(hd, term_can_read, term_read, term_event, NULL); | |
| 2460 | 2459 | } |
| 2461 | 2460 | |
| 2462 | 2461 | /* XXX: use threads ? */ | ... | ... |
vl.c
| ... | ... | @@ -1119,11 +1119,17 @@ void quit_timers(void) |
| 1119 | 1119 | /***********************************************************/ |
| 1120 | 1120 | /* character device */ |
| 1121 | 1121 | |
| 1122 | +static void qemu_chr_event(CharDriverState *s, int event) | |
| 1123 | +{ | |
| 1124 | + if (!s->chr_event) | |
| 1125 | + return; | |
| 1126 | + s->chr_event(s->handler_opaque, event); | |
| 1127 | +} | |
| 1128 | + | |
| 1122 | 1129 | static void qemu_chr_reset_bh(void *opaque) |
| 1123 | 1130 | { |
| 1124 | 1131 | CharDriverState *s = opaque; |
| 1125 | - if (s->chr_event) | |
| 1126 | - s->chr_event(s, CHR_EVENT_RESET); | |
| 1132 | + qemu_chr_event(s, CHR_EVENT_RESET); | |
| 1127 | 1133 | qemu_bh_delete(s->bh); |
| 1128 | 1134 | s->bh = NULL; |
| 1129 | 1135 | } |
| ... | ... | @@ -1148,6 +1154,19 @@ int qemu_chr_ioctl(CharDriverState *s, int cmd, void *arg) |
| 1148 | 1154 | return s->chr_ioctl(s, cmd, arg); |
| 1149 | 1155 | } |
| 1150 | 1156 | |
| 1157 | +int qemu_chr_can_read(CharDriverState *s) | |
| 1158 | +{ | |
| 1159 | + if (!s->chr_can_read) | |
| 1160 | + return 0; | |
| 1161 | + return s->chr_can_read(s->handler_opaque); | |
| 1162 | +} | |
| 1163 | + | |
| 1164 | +void qemu_chr_read(CharDriverState *s, uint8_t *buf, int len) | |
| 1165 | +{ | |
| 1166 | + s->chr_read(s->handler_opaque, buf, len); | |
| 1167 | +} | |
| 1168 | + | |
| 1169 | + | |
| 1151 | 1170 | void qemu_chr_printf(CharDriverState *s, const char *fmt, ...) |
| 1152 | 1171 | { |
| 1153 | 1172 | char buf[4096]; |
| ... | ... | @@ -1164,29 +1183,25 @@ void qemu_chr_send_event(CharDriverState *s, int event) |
| 1164 | 1183 | s->chr_send_event(s, event); |
| 1165 | 1184 | } |
| 1166 | 1185 | |
| 1167 | -void qemu_chr_add_read_handler(CharDriverState *s, | |
| 1168 | - IOCanRWHandler *fd_can_read, | |
| 1169 | - IOReadHandler *fd_read, void *opaque) | |
| 1186 | +void qemu_chr_add_handlers(CharDriverState *s, | |
| 1187 | + IOCanRWHandler *fd_can_read, | |
| 1188 | + IOReadHandler *fd_read, | |
| 1189 | + IOEventHandler *fd_event, | |
| 1190 | + void *opaque) | |
| 1170 | 1191 | { |
| 1171 | - s->chr_add_read_handler(s, fd_can_read, fd_read, opaque); | |
| 1192 | + s->chr_can_read = fd_can_read; | |
| 1193 | + s->chr_read = fd_read; | |
| 1194 | + s->chr_event = fd_event; | |
| 1195 | + s->handler_opaque = opaque; | |
| 1196 | + if (s->chr_update_read_handler) | |
| 1197 | + s->chr_update_read_handler(s); | |
| 1172 | 1198 | } |
| 1173 | 1199 | |
| 1174 | -void qemu_chr_add_event_handler(CharDriverState *s, IOEventHandler *chr_event) | |
| 1175 | -{ | |
| 1176 | - s->chr_event = chr_event; | |
| 1177 | -} | |
| 1178 | - | |
| 1179 | 1200 | static int null_chr_write(CharDriverState *chr, const uint8_t *buf, int len) |
| 1180 | 1201 | { |
| 1181 | 1202 | return len; |
| 1182 | 1203 | } |
| 1183 | 1204 | |
| 1184 | -static void null_chr_add_read_handler(CharDriverState *chr, | |
| 1185 | - IOCanRWHandler *fd_can_read, | |
| 1186 | - IOReadHandler *fd_read, void *opaque) | |
| 1187 | -{ | |
| 1188 | -} | |
| 1189 | - | |
| 1190 | 1205 | static CharDriverState *qemu_chr_open_null(void) |
| 1191 | 1206 | { |
| 1192 | 1207 | CharDriverState *chr; |
| ... | ... | @@ -1195,7 +1210,6 @@ static CharDriverState *qemu_chr_open_null(void) |
| 1195 | 1210 | if (!chr) |
| 1196 | 1211 | return NULL; |
| 1197 | 1212 | chr->chr_write = null_chr_write; |
| 1198 | - chr->chr_add_read_handler = null_chr_add_read_handler; | |
| 1199 | 1213 | return chr; |
| 1200 | 1214 | } |
| 1201 | 1215 | |
| ... | ... | @@ -1287,9 +1301,6 @@ void socket_set_nonblock(int fd) |
| 1287 | 1301 | |
| 1288 | 1302 | typedef struct { |
| 1289 | 1303 | int fd_in, fd_out; |
| 1290 | - IOCanRWHandler *fd_can_read; | |
| 1291 | - IOReadHandler *fd_read; | |
| 1292 | - void *fd_opaque; | |
| 1293 | 1304 | int max_size; |
| 1294 | 1305 | } FDCharDriver; |
| 1295 | 1306 | |
| ... | ... | @@ -1309,7 +1320,7 @@ static int fd_chr_read_poll(void *opaque) |
| 1309 | 1320 | CharDriverState *chr = opaque; |
| 1310 | 1321 | FDCharDriver *s = chr->opaque; |
| 1311 | 1322 | |
| 1312 | - s->max_size = s->fd_can_read(s->fd_opaque); | |
| 1323 | + s->max_size = qemu_chr_can_read(chr); | |
| 1313 | 1324 | return s->max_size; |
| 1314 | 1325 | } |
| 1315 | 1326 | |
| ... | ... | @@ -1332,20 +1343,15 @@ static void fd_chr_read(void *opaque) |
| 1332 | 1343 | return; |
| 1333 | 1344 | } |
| 1334 | 1345 | if (size > 0) { |
| 1335 | - s->fd_read(s->fd_opaque, buf, size); | |
| 1346 | + qemu_chr_read(chr, buf, size); | |
| 1336 | 1347 | } |
| 1337 | 1348 | } |
| 1338 | 1349 | |
| 1339 | -static void fd_chr_add_read_handler(CharDriverState *chr, | |
| 1340 | - IOCanRWHandler *fd_can_read, | |
| 1341 | - IOReadHandler *fd_read, void *opaque) | |
| 1350 | +static void fd_chr_update_read_handler(CharDriverState *chr) | |
| 1342 | 1351 | { |
| 1343 | 1352 | FDCharDriver *s = chr->opaque; |
| 1344 | 1353 | |
| 1345 | 1354 | if (s->fd_in >= 0) { |
| 1346 | - s->fd_can_read = fd_can_read; | |
| 1347 | - s->fd_read = fd_read; | |
| 1348 | - s->fd_opaque = opaque; | |
| 1349 | 1355 | if (nographic && s->fd_in == 0) { |
| 1350 | 1356 | } else { |
| 1351 | 1357 | qemu_set_fd_handler2(s->fd_in, fd_chr_read_poll, |
| ... | ... | @@ -1372,7 +1378,7 @@ static CharDriverState *qemu_chr_open_fd(int fd_in, int fd_out) |
| 1372 | 1378 | s->fd_out = fd_out; |
| 1373 | 1379 | chr->opaque = s; |
| 1374 | 1380 | chr->chr_write = fd_chr_write; |
| 1375 | - chr->chr_add_read_handler = fd_chr_add_read_handler; | |
| 1381 | + chr->chr_update_read_handler = fd_chr_update_read_handler; | |
| 1376 | 1382 | |
| 1377 | 1383 | qemu_chr_reset(chr); |
| 1378 | 1384 | |
| ... | ... | @@ -1465,7 +1471,7 @@ static void stdio_received_byte(int ch) |
| 1465 | 1471 | |
| 1466 | 1472 | chr = stdio_clients[client_index]; |
| 1467 | 1473 | s = chr->opaque; |
| 1468 | - chr->chr_event(s->fd_opaque, CHR_EVENT_BREAK); | |
| 1474 | + qemu_chr_event(chr, CHR_EVENT_BREAK); | |
| 1469 | 1475 | } |
| 1470 | 1476 | break; |
| 1471 | 1477 | case 'c': |
| ... | ... | @@ -1492,13 +1498,11 @@ static void stdio_received_byte(int ch) |
| 1492 | 1498 | if (client_index < stdio_nb_clients) { |
| 1493 | 1499 | uint8_t buf[1]; |
| 1494 | 1500 | CharDriverState *chr; |
| 1495 | - FDCharDriver *s; | |
| 1496 | 1501 | |
| 1497 | 1502 | chr = stdio_clients[client_index]; |
| 1498 | - s = chr->opaque; | |
| 1499 | - if (s->fd_can_read(s->fd_opaque) > 0) { | |
| 1503 | + if (qemu_chr_can_read(chr) > 0) { | |
| 1500 | 1504 | buf[0] = ch; |
| 1501 | - s->fd_read(s->fd_opaque, buf, 1); | |
| 1505 | + qemu_chr_read(chr, buf, 1); | |
| 1502 | 1506 | } else if (term_fifo_size == 0) { |
| 1503 | 1507 | term_fifo[term_fifo_size++] = ch; |
| 1504 | 1508 | } |
| ... | ... | @@ -1509,14 +1513,12 @@ static void stdio_received_byte(int ch) |
| 1509 | 1513 | static int stdio_read_poll(void *opaque) |
| 1510 | 1514 | { |
| 1511 | 1515 | CharDriverState *chr; |
| 1512 | - FDCharDriver *s; | |
| 1513 | 1516 | |
| 1514 | 1517 | if (client_index < stdio_nb_clients) { |
| 1515 | 1518 | chr = stdio_clients[client_index]; |
| 1516 | - s = chr->opaque; | |
| 1517 | 1519 | /* try to flush the queue if needed */ |
| 1518 | - if (term_fifo_size != 0 && s->fd_can_read(s->fd_opaque) > 0) { | |
| 1519 | - s->fd_read(s->fd_opaque, term_fifo, 1); | |
| 1520 | + if (term_fifo_size != 0 && qemu_chr_can_read(chr) > 0) { | |
| 1521 | + qemu_chr_read(chr, term_fifo, 1); | |
| 1520 | 1522 | term_fifo_size = 0; |
| 1521 | 1523 | } |
| 1522 | 1524 | /* see if we can absorb more chars */ |
| ... | ... | @@ -1855,7 +1857,6 @@ static CharDriverState *qemu_chr_open_pp(const char *filename) |
| 1855 | 1857 | } |
| 1856 | 1858 | chr->opaque = (void *)fd; |
| 1857 | 1859 | chr->chr_write = null_chr_write; |
| 1858 | - chr->chr_add_read_handler = null_chr_add_read_handler; | |
| 1859 | 1860 | chr->chr_ioctl = pp_ioctl; |
| 1860 | 1861 | |
| 1861 | 1862 | qemu_chr_reset(chr); |
| ... | ... | @@ -1874,9 +1875,6 @@ static CharDriverState *qemu_chr_open_pty(void) |
| 1874 | 1875 | |
| 1875 | 1876 | #ifdef _WIN32 |
| 1876 | 1877 | typedef struct { |
| 1877 | - IOCanRWHandler *fd_can_read; | |
| 1878 | - IOReadHandler *fd_read; | |
| 1879 | - void *win_opaque; | |
| 1880 | 1878 | int max_size; |
| 1881 | 1879 | HANDLE hcom, hrecv, hsend; |
| 1882 | 1880 | OVERLAPPED orecv, osend; |
| ... | ... | @@ -2020,10 +2018,10 @@ static int win_chr_write(CharDriverState *chr, const uint8_t *buf, int len1) |
| 2020 | 2018 | |
| 2021 | 2019 | static int win_chr_read_poll(WinCharState *s) |
| 2022 | 2020 | { |
| 2023 | - s->max_size = s->fd_can_read(s->win_opaque); | |
| 2021 | + s->max_size = qemu_chr_can_read(s->chr); | |
| 2024 | 2022 | return s->max_size; |
| 2025 | 2023 | } |
| 2026 | - | |
| 2024 | + | |
| 2027 | 2025 | static void win_chr_readfile(WinCharState *s) |
| 2028 | 2026 | { |
| 2029 | 2027 | int ret, err; |
| ... | ... | @@ -2041,7 +2039,7 @@ static void win_chr_readfile(WinCharState *s) |
| 2041 | 2039 | } |
| 2042 | 2040 | |
| 2043 | 2041 | if (size > 0) { |
| 2044 | - s->fd_read(s->win_opaque, buf, size); | |
| 2042 | + qemu_chr_read(s->chr, buf, size); | |
| 2045 | 2043 | } |
| 2046 | 2044 | } |
| 2047 | 2045 | |
| ... | ... | @@ -2071,17 +2069,6 @@ static int win_chr_poll(void *opaque) |
| 2071 | 2069 | return 0; |
| 2072 | 2070 | } |
| 2073 | 2071 | |
| 2074 | -static void win_chr_add_read_handler(CharDriverState *chr, | |
| 2075 | - IOCanRWHandler *fd_can_read, | |
| 2076 | - IOReadHandler *fd_read, void *opaque) | |
| 2077 | -{ | |
| 2078 | - WinCharState *s = chr->opaque; | |
| 2079 | - | |
| 2080 | - s->fd_can_read = fd_can_read; | |
| 2081 | - s->fd_read = fd_read; | |
| 2082 | - s->win_opaque = opaque; | |
| 2083 | -} | |
| 2084 | - | |
| 2085 | 2072 | static CharDriverState *qemu_chr_open_win(const char *filename) |
| 2086 | 2073 | { |
| 2087 | 2074 | CharDriverState *chr; |
| ... | ... | @@ -2097,7 +2084,6 @@ static CharDriverState *qemu_chr_open_win(const char *filename) |
| 2097 | 2084 | } |
| 2098 | 2085 | chr->opaque = s; |
| 2099 | 2086 | chr->chr_write = win_chr_write; |
| 2100 | - chr->chr_add_read_handler = win_chr_add_read_handler; | |
| 2101 | 2087 | chr->chr_close = win_chr_close; |
| 2102 | 2088 | |
| 2103 | 2089 | if (win_chr_init(s, filename) < 0) { |
| ... | ... | @@ -2201,7 +2187,6 @@ static CharDriverState *qemu_chr_open_win_pipe(const char *filename) |
| 2201 | 2187 | } |
| 2202 | 2188 | chr->opaque = s; |
| 2203 | 2189 | chr->chr_write = win_chr_write; |
| 2204 | - chr->chr_add_read_handler = win_chr_add_read_handler; | |
| 2205 | 2190 | chr->chr_close = win_chr_close; |
| 2206 | 2191 | |
| 2207 | 2192 | if (win_chr_pipe_init(s, filename) < 0) { |
| ... | ... | @@ -2229,7 +2214,6 @@ static CharDriverState *qemu_chr_open_win_file(HANDLE fd_out) |
| 2229 | 2214 | s->hcom = fd_out; |
| 2230 | 2215 | chr->opaque = s; |
| 2231 | 2216 | chr->chr_write = win_chr_write; |
| 2232 | - chr->chr_add_read_handler = win_chr_add_read_handler; | |
| 2233 | 2217 | qemu_chr_reset(chr); |
| 2234 | 2218 | return chr; |
| 2235 | 2219 | } |
| ... | ... | @@ -2251,9 +2235,6 @@ static CharDriverState *qemu_chr_open_win_file_out(const char *file_out) |
| 2251 | 2235 | /* UDP Net console */ |
| 2252 | 2236 | |
| 2253 | 2237 | typedef struct { |
| 2254 | - IOCanRWHandler *fd_can_read; | |
| 2255 | - IOReadHandler *fd_read; | |
| 2256 | - void *fd_opaque; | |
| 2257 | 2238 | int fd; |
| 2258 | 2239 | struct sockaddr_in daddr; |
| 2259 | 2240 | char buf[1024]; |
| ... | ... | @@ -2275,15 +2256,15 @@ static int udp_chr_read_poll(void *opaque) |
| 2275 | 2256 | CharDriverState *chr = opaque; |
| 2276 | 2257 | NetCharDriver *s = chr->opaque; |
| 2277 | 2258 | |
| 2278 | - s->max_size = s->fd_can_read(s->fd_opaque); | |
| 2259 | + s->max_size = qemu_chr_can_read(chr); | |
| 2279 | 2260 | |
| 2280 | 2261 | /* If there were any stray characters in the queue process them |
| 2281 | 2262 | * first |
| 2282 | 2263 | */ |
| 2283 | 2264 | while (s->max_size > 0 && s->bufptr < s->bufcnt) { |
| 2284 | - s->fd_read(s->fd_opaque, &s->buf[s->bufptr], 1); | |
| 2265 | + qemu_chr_read(chr, &s->buf[s->bufptr], 1); | |
| 2285 | 2266 | s->bufptr++; |
| 2286 | - s->max_size = s->fd_can_read(s->fd_opaque); | |
| 2267 | + s->max_size = qemu_chr_can_read(chr); | |
| 2287 | 2268 | } |
| 2288 | 2269 | return s->max_size; |
| 2289 | 2270 | } |
| ... | ... | @@ -2302,22 +2283,17 @@ static void udp_chr_read(void *opaque) |
| 2302 | 2283 | |
| 2303 | 2284 | s->bufptr = 0; |
| 2304 | 2285 | while (s->max_size > 0 && s->bufptr < s->bufcnt) { |
| 2305 | - s->fd_read(s->fd_opaque, &s->buf[s->bufptr], 1); | |
| 2286 | + qemu_chr_read(chr, &s->buf[s->bufptr], 1); | |
| 2306 | 2287 | s->bufptr++; |
| 2307 | - s->max_size = s->fd_can_read(s->fd_opaque); | |
| 2288 | + s->max_size = qemu_chr_can_read(chr); | |
| 2308 | 2289 | } |
| 2309 | 2290 | } |
| 2310 | 2291 | |
| 2311 | -static void udp_chr_add_read_handler(CharDriverState *chr, | |
| 2312 | - IOCanRWHandler *fd_can_read, | |
| 2313 | - IOReadHandler *fd_read, void *opaque) | |
| 2292 | +static void udp_chr_update_read_handler(CharDriverState *chr) | |
| 2314 | 2293 | { |
| 2315 | 2294 | NetCharDriver *s = chr->opaque; |
| 2316 | 2295 | |
| 2317 | 2296 | if (s->fd >= 0) { |
| 2318 | - s->fd_can_read = fd_can_read; | |
| 2319 | - s->fd_read = fd_read; | |
| 2320 | - s->fd_opaque = opaque; | |
| 2321 | 2297 | qemu_set_fd_handler2(s->fd, udp_chr_read_poll, |
| 2322 | 2298 | udp_chr_read, NULL, chr); |
| 2323 | 2299 | } |
| ... | ... | @@ -2367,7 +2343,7 @@ static CharDriverState *qemu_chr_open_udp(const char *def) |
| 2367 | 2343 | s->bufptr = 0; |
| 2368 | 2344 | chr->opaque = s; |
| 2369 | 2345 | chr->chr_write = udp_chr_write; |
| 2370 | - chr->chr_add_read_handler = udp_chr_add_read_handler; | |
| 2346 | + chr->chr_update_read_handler = udp_chr_update_read_handler; | |
| 2371 | 2347 | return chr; |
| 2372 | 2348 | |
| 2373 | 2349 | return_err: |
| ... | ... | @@ -2384,13 +2360,11 @@ return_err: |
| 2384 | 2360 | /* TCP Net console */ |
| 2385 | 2361 | |
| 2386 | 2362 | typedef struct { |
| 2387 | - IOCanRWHandler *fd_can_read; | |
| 2388 | - IOReadHandler *fd_read; | |
| 2389 | - void *fd_opaque; | |
| 2390 | 2363 | int fd, listen_fd; |
| 2391 | 2364 | int connected; |
| 2392 | 2365 | int max_size; |
| 2393 | 2366 | int do_telnetopt; |
| 2367 | + int do_nodelay; | |
| 2394 | 2368 | int is_unix; |
| 2395 | 2369 | } TCPCharDriver; |
| 2396 | 2370 | |
| ... | ... | @@ -2413,9 +2387,7 @@ static int tcp_chr_read_poll(void *opaque) |
| 2413 | 2387 | TCPCharDriver *s = chr->opaque; |
| 2414 | 2388 | if (!s->connected) |
| 2415 | 2389 | return 0; |
| 2416 | - if (!s->fd_can_read) | |
| 2417 | - return 0; | |
| 2418 | - s->max_size = s->fd_can_read(s->fd_opaque); | |
| 2390 | + s->max_size = qemu_chr_can_read(chr); | |
| 2419 | 2391 | return s->max_size; |
| 2420 | 2392 | } |
| 2421 | 2393 | |
| ... | ... | @@ -2448,7 +2420,7 @@ static void tcp_chr_process_IAC_bytes(CharDriverState *chr, |
| 2448 | 2420 | } else { |
| 2449 | 2421 | if ((unsigned char)buf[i] == IAC_BREAK && s->do_telnetopt == 2) { |
| 2450 | 2422 | /* Handle IAC break commands by sending a serial break */ |
| 2451 | - chr->chr_event(s->fd_opaque, CHR_EVENT_BREAK); | |
| 2423 | + qemu_chr_event(chr, CHR_EVENT_BREAK); | |
| 2452 | 2424 | s->do_telnetopt++; |
| 2453 | 2425 | } |
| 2454 | 2426 | s->do_telnetopt++; |
| ... | ... | @@ -2495,21 +2467,10 @@ static void tcp_chr_read(void *opaque) |
| 2495 | 2467 | if (s->do_telnetopt) |
| 2496 | 2468 | tcp_chr_process_IAC_bytes(chr, s, buf, &size); |
| 2497 | 2469 | if (size > 0) |
| 2498 | - s->fd_read(s->fd_opaque, buf, size); | |
| 2470 | + qemu_chr_read(chr, buf, size); | |
| 2499 | 2471 | } |
| 2500 | 2472 | } |
| 2501 | 2473 | |
| 2502 | -static void tcp_chr_add_read_handler(CharDriverState *chr, | |
| 2503 | - IOCanRWHandler *fd_can_read, | |
| 2504 | - IOReadHandler *fd_read, void *opaque) | |
| 2505 | -{ | |
| 2506 | - TCPCharDriver *s = chr->opaque; | |
| 2507 | - | |
| 2508 | - s->fd_can_read = fd_can_read; | |
| 2509 | - s->fd_read = fd_read; | |
| 2510 | - s->fd_opaque = opaque; | |
| 2511 | -} | |
| 2512 | - | |
| 2513 | 2474 | static void tcp_chr_connect(void *opaque) |
| 2514 | 2475 | { |
| 2515 | 2476 | CharDriverState *chr = opaque; |
| ... | ... | @@ -2658,7 +2619,6 @@ static CharDriverState *qemu_chr_open_tcp(const char *host_str, |
| 2658 | 2619 | |
| 2659 | 2620 | chr->opaque = s; |
| 2660 | 2621 | chr->chr_write = tcp_chr_write; |
| 2661 | - chr->chr_add_read_handler = tcp_chr_add_read_handler; | |
| 2662 | 2622 | chr->chr_close = tcp_chr_close; |
| 2663 | 2623 | |
| 2664 | 2624 | if (is_listen) { | ... | ... |
vl.h
| ... | ... | @@ -293,11 +293,12 @@ typedef void IOEventHandler(void *opaque, int event); |
| 293 | 293 | |
| 294 | 294 | typedef struct CharDriverState { |
| 295 | 295 | int (*chr_write)(struct CharDriverState *s, const uint8_t *buf, int len); |
| 296 | - void (*chr_add_read_handler)(struct CharDriverState *s, | |
| 297 | - IOCanRWHandler *fd_can_read, | |
| 298 | - IOReadHandler *fd_read, void *opaque); | |
| 296 | + void (*chr_update_read_handler)(struct CharDriverState *s); | |
| 299 | 297 | int (*chr_ioctl)(struct CharDriverState *s, int cmd, void *arg); |
| 300 | 298 | IOEventHandler *chr_event; |
| 299 | + IOCanRWHandler *chr_can_read; | |
| 300 | + IOReadHandler *chr_read; | |
| 301 | + void *handler_opaque; | |
| 301 | 302 | void (*chr_send_event)(struct CharDriverState *chr, int event); |
| 302 | 303 | void (*chr_close)(struct CharDriverState *chr); |
| 303 | 304 | void *opaque; |
| ... | ... | @@ -308,12 +309,15 @@ CharDriverState *qemu_chr_open(const char *filename); |
| 308 | 309 | void qemu_chr_printf(CharDriverState *s, const char *fmt, ...); |
| 309 | 310 | int qemu_chr_write(CharDriverState *s, const uint8_t *buf, int len); |
| 310 | 311 | void qemu_chr_send_event(CharDriverState *s, int event); |
| 311 | -void qemu_chr_add_read_handler(CharDriverState *s, | |
| 312 | - IOCanRWHandler *fd_can_read, | |
| 313 | - IOReadHandler *fd_read, void *opaque); | |
| 314 | -void qemu_chr_add_event_handler(CharDriverState *s, IOEventHandler *chr_event); | |
| 312 | +void qemu_chr_add_handlers(CharDriverState *s, | |
| 313 | + IOCanRWHandler *fd_can_read, | |
| 314 | + IOReadHandler *fd_read, | |
| 315 | + IOEventHandler *fd_event, | |
| 316 | + void *opaque); | |
| 315 | 317 | int qemu_chr_ioctl(CharDriverState *s, int cmd, void *arg); |
| 316 | 318 | void qemu_chr_reset(CharDriverState *s); |
| 319 | +int qemu_chr_can_read(CharDriverState *s); | |
| 320 | +void qemu_chr_read(CharDriverState *s, uint8_t *buf, int len); | |
| 317 | 321 | |
| 318 | 322 | /* consoles */ |
| 319 | 323 | ... | ... |