[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v2 5/5] iohandlers: Add IOHandlerOps struct
From: |
Amit Shah |
Subject: |
[Qemu-devel] [PATCH v2 5/5] iohandlers: Add IOHandlerOps struct |
Date: |
Thu, 13 Jan 2011 20:30:42 +0530 |
Collect all the handlers in a IOHandlerOps struct instead of being
passed one at a time to each function.
Signed-off-by: Amit Shah <address@hidden>
---
qemu-char.h | 7 ++-----
vl.c | 56 ++++++++++++++++++++++++++++++++++++--------------------
2 files changed, 38 insertions(+), 25 deletions(-)
diff --git a/qemu-char.h b/qemu-char.h
index e88a108..ebf9cd1 100644
--- a/qemu-char.h
+++ b/qemu-char.h
@@ -108,12 +108,9 @@ QString *qemu_chr_mem_to_qs(CharDriverState *chr);
size_t qemu_chr_mem_osize(const CharDriverState *chr);
/* async I/O support */
+typedef struct IOHandlerOps IOHandlerOps;
-int assign_fd_handlers(int fd,
- IOCanReadHandler *fd_read_poll,
- IOHandler *fd_read,
- IOHandler *fd_write,
- void *opaque);
+int assign_fd_handlers(int fd, const IOHandlerOps *ops, void *opaque);
void remove_fd_handlers(int fd);
int set_read_poll_fd_action(int fd, bool enable);
int set_read_fd_action(int fd, bool enable);
diff --git a/vl.c b/vl.c
index 4aa4158..a98256c 100644
--- a/vl.c
+++ b/vl.c
@@ -1007,11 +1007,20 @@ void pcmcia_info(Monitor *mon)
/***********************************************************/
/* I/O handling */
-typedef struct IOHandlerRecord {
- int fd;
+struct IOHandlerOps {
IOCanReadHandler *fd_read_poll;
IOHandler *fd_read;
IOHandler *fd_write;
+};
+
+typedef struct IOHandlerRecord {
+ int fd;
+ /*
+ * TODO: once the users of qemu_set_fd_handler*() functions have
+ * been removed, just store the ops pointer instead of copying
+ * over each element here.
+ */
+ IOHandlerOps ops;
int deleted;
void *opaque;
bool read_poll_enabled;
@@ -1025,6 +1034,10 @@ typedef struct IOHandlerRecord {
static QLIST_HEAD(, IOHandlerRecord) io_handlers =
QLIST_HEAD_INITIALIZER(io_handlers);
+static const IOHandlerOps null_ioh_ops = {
+ /* All ops are NULL */
+};
+
static IOHandlerRecord *get_iohandler(int fd)
{
IOHandlerRecord *ioh;
@@ -1051,7 +1064,7 @@ int set_read_poll_fd_action(int fd, bool enable)
}
ioh->read_poll_enabled = false;
- if (enable && ioh->fd_read_poll) {
+ if (enable && ioh->ops.fd_read_poll) {
ioh->read_poll_enabled = true;
}
@@ -1072,7 +1085,7 @@ int set_read_fd_action(int fd, bool enable)
}
ioh->read_enabled = false;
- if (enable && ioh->fd_read) {
+ if (enable && ioh->ops.fd_read) {
ioh->read_enabled = true;
}
@@ -1093,7 +1106,7 @@ int set_write_fd_action(int fd, bool enable)
}
ioh->write_enabled = false;
- if (enable && ioh->fd_write) {
+ if (enable && ioh->ops.fd_write) {
ioh->write_enabled = true;
}
@@ -1106,17 +1119,16 @@ int set_write_fd_action(int fd, bool enable)
* XXX: fd_read_poll should be suppressed, but an API change is
* necessary in the character devices to suppress fd_can_read().
*/
-int assign_fd_handlers(int fd,
- IOCanReadHandler *fd_read_poll,
- IOHandler *fd_read,
- IOHandler *fd_write,
- void *opaque)
+int assign_fd_handlers(int fd, const IOHandlerOps *ops, void *opaque)
{
IOHandlerRecord *ioh;
ioh = get_iohandler(fd);
- if (ioh && !fd_read && !fd_write) {
+ if (!ops) {
+ ops = &null_ioh_ops;
+ }
+ if (ioh && !ops->fd_read && !ops->fd_write) {
ioh->deleted = 1;
return 0;
}
@@ -1127,9 +1139,7 @@ int assign_fd_handlers(int fd,
ioh->fd = fd;
}
- ioh->fd_read_poll = fd_read_poll;
- ioh->fd_read = fd_read;
- ioh->fd_write = fd_write;
+ ioh->ops = *ops;
ioh->opaque = opaque;
ioh->deleted = 0;
@@ -1156,12 +1166,13 @@ int assign_fd_handlers(int fd,
*/
void remove_fd_handlers(int fd)
{
- assign_fd_handlers(fd, NULL, NULL, NULL, NULL);
+ assign_fd_handlers(fd, NULL, NULL);
}
/*
* TODO: Deprecate these two function calls in favour of
- * assign_fd_handlers().
+ * assign_fd_handlers(). When that happens, also see the TODO in the
+ * IOHandlerRecord struct above.
*/
int qemu_set_fd_handler2(int fd,
IOCanReadHandler *fd_read_poll,
@@ -1169,7 +1180,12 @@ int qemu_set_fd_handler2(int fd,
IOHandler *fd_write,
void *opaque)
{
- return assign_fd_handlers(fd, fd_read_poll, fd_read, fd_write, opaque);
+ IOHandlerOps ops;
+
+ ops.fd_read_poll = fd_read_poll;
+ ops.fd_read = fd_read;
+ ops.fd_write = fd_write;
+ return assign_fd_handlers(fd, &ops, opaque);
}
int qemu_set_fd_handler(int fd,
@@ -1434,7 +1450,7 @@ void main_loop_wait(int nonblocking)
if (ioh->deleted)
continue;
if (ioh->read_enabled &&
- (!ioh->read_poll_enabled || ioh->fd_read_poll(ioh->opaque) != 0)) {
+ (!ioh->read_poll_enabled || ioh->ops.fd_read_poll(ioh->opaque) !=
0)) {
FD_SET(ioh->fd, &rfds);
if (ioh->fd > nfds)
nfds = ioh->fd;
@@ -1459,10 +1475,10 @@ void main_loop_wait(int nonblocking)
QLIST_FOREACH_SAFE(ioh, &io_handlers, next, pioh) {
if (!ioh->deleted && ioh->read_enabled && FD_ISSET(ioh->fd,
&rfds)) {
- ioh->fd_read(ioh->opaque);
+ ioh->ops.fd_read(ioh->opaque);
}
if (!ioh->deleted && ioh->write_enabled && FD_ISSET(ioh->fd,
&wfds)) {
- ioh->fd_write(ioh->opaque);
+ ioh->ops.fd_write(ioh->opaque);
}
/* Do this last in case read/write handlers marked it for deletion
*/
--
1.7.3.4
- [Qemu-devel] [PATCH v2 0/5] iohandlers: Add support for enabling/disabling individual handlers, Amit Shah, 2011/01/13
- [Qemu-devel] [PATCH v2 1/5] iohandlers: Avoid code duplication, Amit Shah, 2011/01/13
- [Qemu-devel] [PATCH v2 2/5] iohandlers: Introduce assign_fd_handlers() and remove_fd_handlers, Amit Shah, 2011/01/13
- [Qemu-devel] [PATCH v2 3/5] iohandlers: Allow each iohandler to be enabled/disabled individually, Amit Shah, 2011/01/13
- [Qemu-devel] [PATCH v2 4/5] iohandlers: Enable an iohandler only if the associated handler exists, Amit Shah, 2011/01/13
- [Qemu-devel] [PATCH v2 5/5] iohandlers: Add IOHandlerOps struct,
Amit Shah <=
- [Qemu-devel] Re: [PATCH v2 0/5] iohandlers: Add support for enabling/disabling individual handlers, Gerd Hoffmann, 2011/01/13
- [Qemu-devel] Re: [PATCH v2 0/5] iohandlers: Add support for enabling/disabling individual handlers, Anthony Liguori, 2011/01/13