[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v8 3/7] char: Introduce char_set/remove_fd_handlers(
From: |
Amit Shah |
Subject: |
[Qemu-devel] [PATCH v8 3/7] char: Introduce char_set/remove_fd_handlers() |
Date: |
Wed, 1 Dec 2010 15:24:25 +0530 |
Introduce a char-specific wrapper to qemu_set_fd_handler functions.
This wrapper is useful to add / remove a write handler easily. Write
handlers are only used when the backend is blocked and cannot receive
any more input.
Signed-off-by: Amit Shah <address@hidden>
---
qemu-char.c | 64 ++++++++++++++++++++++++++++++++++++++--------------------
1 files changed, 42 insertions(+), 22 deletions(-)
diff --git a/qemu-char.c b/qemu-char.c
index d77530d..483a5fd 100644
--- a/qemu-char.c
+++ b/qemu-char.c
@@ -214,6 +214,24 @@ void qemu_chr_add_handlers(CharDriverState *s,
}
}
+static int char_set_fd_handlers(int fd,
+ IOCanReadHandler *fd_read_poll,
+ IOHandler *fd_read, IOHandler *fd_write,
+ void *opaque, bool install_write_handler)
+{
+ if (install_write_handler) {
+ assert(fd_write);
+ } else {
+ fd_write = NULL;
+ }
+ return qemu_set_fd_handler2(fd, fd_read_poll, fd_read, fd_write, opaque);
+}
+
+static int char_remove_fd_handlers(int fd)
+{
+ return qemu_set_fd_handler2(fd, NULL, NULL, NULL, NULL);
+}
+
static int null_chr_write(CharDriverState *chr, const uint8_t *buf, int len)
{
return len;
@@ -579,7 +597,7 @@ static void fd_chr_read(void *opaque)
size = read(s->fd_in, buf, len);
if (size == 0) {
/* FD has been closed. Remove it from the active list. */
- qemu_set_fd_handler2(s->fd_in, NULL, NULL, NULL, NULL);
+ char_remove_fd_handlers(s->fd_in);
qemu_chr_event(chr, CHR_EVENT_CLOSED);
return;
}
@@ -595,8 +613,8 @@ static void fd_chr_update_read_handler(CharDriverState *chr)
if (s->fd_in >= 0) {
if (display_type == DT_NOGRAPHIC && s->fd_in == 0) {
} else {
- qemu_set_fd_handler2(s->fd_in, fd_chr_read_poll,
- fd_chr_read, NULL, chr);
+ char_set_fd_handlers(s->fd_in, fd_chr_read_poll, fd_chr_read,
+ NULL, chr, false);
}
}
}
@@ -608,7 +626,7 @@ static void fd_chr_close(struct CharDriverState *chr)
if (s->fd_in >= 0) {
if (display_type == DT_NOGRAPHIC && s->fd_in == 0) {
} else {
- qemu_set_fd_handler2(s->fd_in, NULL, NULL, NULL, NULL);
+ char_remove_fd_handlers(s->fd_in);
}
}
@@ -708,7 +726,7 @@ static void stdio_read(void *opaque)
size = read(0, buf, 1);
if (size == 0) {
/* stdin has been closed. Remove it from the active list. */
- qemu_set_fd_handler2(0, NULL, NULL, NULL, NULL);
+ char_remove_fd_handlers(0);
qemu_chr_event(chr, CHR_EVENT_CLOSED);
return;
}
@@ -764,7 +782,7 @@ static void qemu_chr_close_stdio(struct CharDriverState
*chr)
{
term_exit();
stdio_nb_clients--;
- qemu_set_fd_handler2(0, NULL, NULL, NULL, NULL);
+ char_remove_fd_handlers(0);
fd_chr_close(chr);
}
@@ -776,7 +794,7 @@ static CharDriverState *qemu_chr_open_stdio(QemuOpts *opts)
return NULL;
chr = qemu_chr_open_fd(0, 1);
chr->chr_close = qemu_chr_close_stdio;
- qemu_set_fd_handler2(0, stdio_read_poll, stdio_read, NULL, chr);
+ char_set_fd_handlers(0, stdio_read_poll, stdio_read, NULL, chr, false);
stdio_nb_clients++;
term_init(opts);
@@ -904,8 +922,8 @@ static void pty_chr_update_read_handler(CharDriverState
*chr)
{
PtyCharDriver *s = chr->opaque;
- qemu_set_fd_handler2(s->fd, pty_chr_read_poll,
- pty_chr_read, NULL, chr);
+ char_set_fd_handlers(s->fd, pty_chr_read_poll, pty_chr_read, NULL,
+ chr, false);
s->polling = 1;
/*
* Short timeout here: just need wait long enougth that qemu makes
@@ -923,7 +941,7 @@ static void pty_chr_state(CharDriverState *chr, int
connected)
PtyCharDriver *s = chr->opaque;
if (!connected) {
- qemu_set_fd_handler2(s->fd, NULL, NULL, NULL, NULL);
+ char_remove_fd_handlers(s->fd);
s->connected = 0;
s->polling = 0;
/* (re-)connect poll interval for idle guests: once per second.
@@ -959,7 +977,7 @@ static void pty_chr_close(struct CharDriverState *chr)
{
PtyCharDriver *s = chr->opaque;
- qemu_set_fd_handler2(s->fd, NULL, NULL, NULL, NULL);
+ char_remove_fd_handlers(s->fd);
close(s->fd);
qemu_del_timer(s->timer);
qemu_free_timer(s->timer);
@@ -1860,8 +1878,8 @@ static void udp_chr_update_read_handler(CharDriverState
*chr)
NetCharDriver *s = chr->opaque;
if (s->fd >= 0) {
- qemu_set_fd_handler2(s->fd, udp_chr_read_poll,
- udp_chr_read, NULL, chr);
+ char_set_fd_handlers(s->fd, udp_chr_read_poll, udp_chr_read, NULL,
+ chr, false);
}
}
@@ -1869,7 +1887,7 @@ static void udp_chr_close(CharDriverState *chr)
{
NetCharDriver *s = chr->opaque;
if (s->fd >= 0) {
- qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
+ char_remove_fd_handlers(s->fd);
closesocket(s->fd);
}
qemu_free(s);
@@ -2078,9 +2096,10 @@ static void tcp_chr_read(void *opaque)
/* connection closed */
s->connected = 0;
if (s->listen_fd >= 0) {
- qemu_set_fd_handler(s->listen_fd, tcp_chr_accept, NULL, chr);
+ char_set_fd_handlers(s->listen_fd, NULL, tcp_chr_accept, NULL,
+ chr, false);
}
- qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
+ char_remove_fd_handlers(s->fd);
closesocket(s->fd);
s->fd = -1;
qemu_chr_event(chr, CHR_EVENT_CLOSED);
@@ -2105,8 +2124,8 @@ static void tcp_chr_connect(void *opaque)
TCPCharDriver *s = chr->opaque;
s->connected = 1;
- qemu_set_fd_handler2(s->fd, tcp_chr_read_poll,
- tcp_chr_read, NULL, chr);
+ char_set_fd_handlers(s->fd, tcp_chr_read_poll, tcp_chr_read, NULL,
+ chr, false);
qemu_chr_generic_open(chr);
}
@@ -2167,7 +2186,7 @@ static void tcp_chr_accept(void *opaque)
if (s->do_nodelay)
socket_set_nodelay(fd);
s->fd = fd;
- qemu_set_fd_handler(s->listen_fd, NULL, NULL, NULL);
+ char_remove_fd_handlers(s->listen_fd);
tcp_chr_connect(chr);
}
@@ -2175,11 +2194,11 @@ static void tcp_chr_close(CharDriverState *chr)
{
TCPCharDriver *s = chr->opaque;
if (s->fd >= 0) {
- qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
+ char_remove_fd_handlers(s->fd);
closesocket(s->fd);
}
if (s->listen_fd >= 0) {
- qemu_set_fd_handler(s->listen_fd, NULL, NULL, NULL);
+ char_remove_fd_handlers(s->listen_fd);
closesocket(s->listen_fd);
}
qemu_free(s);
@@ -2241,7 +2260,8 @@ static CharDriverState *qemu_chr_open_socket(QemuOpts
*opts)
if (is_listen) {
s->listen_fd = fd;
- qemu_set_fd_handler(s->listen_fd, tcp_chr_accept, NULL, chr);
+ char_set_fd_handlers(s->listen_fd, NULL, tcp_chr_accept, NULL,
+ chr, false);
if (is_telnet)
s->do_telnetopt = 1;
--
1.7.3.2
- [Qemu-devel] [PATCH v8 0/7] char: non-blocking writes, virtio-console flow control, Amit Shah, 2010/12/01
- [Qemu-devel] [PATCH v8 1/7] virtio-console: Factor out common init between console and generic ports, Amit Shah, 2010/12/01
- [Qemu-devel] [PATCH v8 2/7] char: Add a QemuChrHandlers struct to initialise chardev handlers, Amit Shah, 2010/12/01
- [Qemu-devel] [PATCH v8 3/7] char: Introduce char_set/remove_fd_handlers(),
Amit Shah <=
- [Qemu-devel] [PATCH v8 4/7] char: Add framework for a 'write unblocked' callback, Amit Shah, 2010/12/01
- [Qemu-devel] [PATCH v8 5/7] char: Update send_all() to handle nonblocking chardev write requests, Amit Shah, 2010/12/01
- [Qemu-devel] [PATCH v8 6/7] char: Equip the unix/tcp backend to handle nonblocking writes, Amit Shah, 2010/12/01
- [Qemu-devel] [PATCH v8 7/7] virtio-console: Enable port throttling when chardev is slow to consume data, Amit Shah, 2010/12/01
- Re: [Qemu-devel] [PATCH v8 7/7] virtio-console: Enable port throttling when chardev is slow to consume data, Paul Brook, 2010/12/01
- Re: [Qemu-devel] [PATCH v8 7/7] virtio-console: Enable port throttling when chardev is slow to consume data, Amit Shah, 2010/12/01
- Re: [Qemu-devel] [PATCH v8 7/7] virtio-console: Enable port throttling when chardev is slow to consume data, Paul Brook, 2010/12/01
- Re: [Qemu-devel] [PATCH v8 7/7] virtio-console: Enable port throttling when chardev is slow to consume data, Amit Shah, 2010/12/01
- Re: [Qemu-devel] [PATCH v8 7/7] virtio-console: Enable port throttling when chardev is slow to consume data, Paul Brook, 2010/12/01
- Re: [Qemu-devel] [PATCH v8 7/7] virtio-console: Enable port throttling when chardev is slow to consume data, Amit Shah, 2010/12/02