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 | ... | ... |