[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [RFC PATCH v2 13/13] iohandler: Use AioContext internally
From: |
Fam Zheng |
Subject: |
[Qemu-devel] [RFC PATCH v2 13/13] iohandler: Use AioContext internally |
Date: |
Thu, 14 May 2015 11:34:29 +0800 |
AioContext and iohandler share the same concept except that AioContext
is more generalized - it runs on an AioContext which could be on the
main thread or an iothread. Similar to the relation of qemu_bh_new and
aio_bh_new, the iohandler is the special case of AioContext which
happens to run on the main thread context.
Previously the only mismatch is the presense of qemu_set_fd_handler2
with the special "can_read" parameter which is not available in
AioContext interface, now the parameter is removed, let's unify the code
and make iohandler a wrapper. Meanwhile, change the function's return
type to void because it always returns 0.
This also simplifies the main loop by removing the qemu_iohandler_fill
and qemu_iohandler_poll hooks.
One tiny things is this also makes sigfd depends on the main loop
AioContext, so we have to move the call of qemu_signal_init() in after
creation of qemu_aio_context.
Signed-off-by: Fam Zheng <address@hidden>
---
include/qemu/main-loop.h | 10 ++---
iohandler.c | 110 -----------------------------------------------
main-loop.c | 21 ++++++---
stubs/set-fd-handler.c | 8 ++--
4 files changed, 22 insertions(+), 127 deletions(-)
diff --git a/include/qemu/main-loop.h b/include/qemu/main-loop.h
index 7da1d63..ef87d1c 100644
--- a/include/qemu/main-loop.h
+++ b/include/qemu/main-loop.h
@@ -198,10 +198,10 @@ typedef int IOCanReadHandler(void *opaque);
*
* @opaque: A pointer-sized value that is passed to @fd_read and @fd_write.
*/
-int qemu_set_fd_handler(int fd,
- IOHandler *fd_read,
- IOHandler *fd_write,
- void *opaque);
+void qemu_set_fd_handler(int fd,
+ IOHandler *fd_read,
+ IOHandler *fd_write,
+ void *opaque);
#ifdef CONFIG_POSIX
/**
@@ -255,8 +255,6 @@ void qemu_mutex_unlock_iothread(void);
/* internal interfaces */
void qemu_fd_register(int fd);
-void qemu_iohandler_fill(GArray *pollfds);
-void qemu_iohandler_poll(GArray *pollfds, int rc);
QEMUBH *qemu_bh_new(QEMUBHFunc *cb, void *opaque);
void qemu_bh_schedule_idle(QEMUBH *bh);
diff --git a/iohandler.c b/iohandler.c
index d361cf2..c7f4d01 100644
--- a/iohandler.c
+++ b/iohandler.c
@@ -24,122 +24,12 @@
#include "config-host.h"
#include "qemu-common.h"
-#include "qemu/queue.h"
-#include "block/aio.h"
#include "qemu/main-loop.h"
#ifndef _WIN32
#include <sys/wait.h>
#endif
-typedef struct IOHandlerRecord {
- IOHandler *fd_read;
- IOHandler *fd_write;
- void *opaque;
- QLIST_ENTRY(IOHandlerRecord) next;
- int fd;
- int pollfds_idx;
- bool deleted;
-} IOHandlerRecord;
-
-static QLIST_HEAD(, IOHandlerRecord) io_handlers =
- QLIST_HEAD_INITIALIZER(io_handlers);
-
-int qemu_set_fd_handler(int fd,
- IOHandler *fd_read,
- IOHandler *fd_write,
- void *opaque)
-{
- IOHandlerRecord *ioh;
-
- assert(fd >= 0);
-
- if (!fd_read && !fd_write) {
- QLIST_FOREACH(ioh, &io_handlers, next) {
- if (ioh->fd == fd) {
- ioh->deleted = 1;
- break;
- }
- }
- } else {
- QLIST_FOREACH(ioh, &io_handlers, next) {
- if (ioh->fd == fd)
- goto found;
- }
- ioh = g_malloc0(sizeof(IOHandlerRecord));
- QLIST_INSERT_HEAD(&io_handlers, ioh, next);
- found:
- ioh->fd = fd;
- ioh->fd_read = fd_read;
- ioh->fd_write = fd_write;
- ioh->opaque = opaque;
- ioh->pollfds_idx = -1;
- ioh->deleted = 0;
- qemu_notify_event();
- }
- return 0;
-}
-
-void qemu_iohandler_fill(GArray *pollfds)
-{
- IOHandlerRecord *ioh;
-
- QLIST_FOREACH(ioh, &io_handlers, next) {
- int events = 0;
-
- if (ioh->deleted)
- continue;
- if (ioh->fd_read) {
- events |= G_IO_IN | G_IO_HUP | G_IO_ERR;
- }
- if (ioh->fd_write) {
- events |= G_IO_OUT | G_IO_ERR;
- }
- if (events) {
- GPollFD pfd = {
- .fd = ioh->fd,
- .events = events,
- };
- ioh->pollfds_idx = pollfds->len;
- g_array_append_val(pollfds, pfd);
- } else {
- ioh->pollfds_idx = -1;
- }
- }
-}
-
-void qemu_iohandler_poll(GArray *pollfds, int ret)
-{
- if (ret > 0) {
- IOHandlerRecord *pioh, *ioh;
-
- QLIST_FOREACH_SAFE(ioh, &io_handlers, next, pioh) {
- int revents = 0;
-
- if (!ioh->deleted && ioh->pollfds_idx != -1) {
- GPollFD *pfd = &g_array_index(pollfds, GPollFD,
- ioh->pollfds_idx);
- revents = pfd->revents;
- }
-
- if (!ioh->deleted && ioh->fd_read &&
- (revents & (G_IO_IN | G_IO_HUP | G_IO_ERR))) {
- ioh->fd_read(ioh->opaque);
- }
- if (!ioh->deleted && ioh->fd_write &&
- (revents & (G_IO_OUT | G_IO_ERR))) {
- ioh->fd_write(ioh->opaque);
- }
-
- /* Do this last in case read/write handlers marked it for deletion
*/
- if (ioh->deleted) {
- QLIST_REMOVE(ioh, next);
- g_free(ioh);
- }
- }
- }
-}
-
/* reaping of zombies. right now we're not passing the status to
anyone, but it would be possible to add a callback. */
#ifndef _WIN32
diff --git a/main-loop.c b/main-loop.c
index 82875a4..20776f9 100644
--- a/main-loop.c
+++ b/main-loop.c
@@ -138,16 +138,17 @@ int qemu_init_main_loop(Error **errp)
init_clocks();
- ret = qemu_signal_init();
- if (ret) {
- return ret;
- }
-
qemu_aio_context = aio_context_new(&local_error);
if (!qemu_aio_context) {
error_propagate(errp, local_error);
return -EMFILE;
}
+
+ ret = qemu_signal_init();
+ if (ret) {
+ return ret;
+ }
+
gpollfds = g_array_new(FALSE, FALSE, sizeof(GPollFD));
src = aio_get_g_source(qemu_aio_context);
g_source_attach(src, NULL);
@@ -478,7 +479,6 @@ int main_loop_wait(int nonblocking)
#ifdef CONFIG_SLIRP
slirp_pollfds_fill(gpollfds, &timeout);
#endif
- qemu_iohandler_fill(gpollfds);
if (timeout == UINT32_MAX) {
timeout_ns = -1;
@@ -491,7 +491,6 @@ int main_loop_wait(int nonblocking)
&main_loop_tlg));
ret = os_host_main_loop_wait(timeout_ns);
- qemu_iohandler_poll(gpollfds, ret);
#ifdef CONFIG_SLIRP
slirp_pollfds_poll(gpollfds, (ret < 0));
#endif
@@ -507,3 +506,11 @@ QEMUBH *qemu_bh_new(QEMUBHFunc *cb, void *opaque)
{
return aio_bh_new(qemu_aio_context, cb, opaque);
}
+
+void qemu_set_fd_handler(int fd,
+ IOHandler *fd_read,
+ IOHandler *fd_write,
+ void *opaque)
+{
+ aio_set_fd_handler(qemu_aio_context, fd, fd_read, fd_write, opaque);
+}
diff --git a/stubs/set-fd-handler.c b/stubs/set-fd-handler.c
index a895e62..a8481bc 100644
--- a/stubs/set-fd-handler.c
+++ b/stubs/set-fd-handler.c
@@ -1,10 +1,10 @@
#include "qemu-common.h"
#include "qemu/main-loop.h"
-int qemu_set_fd_handler(int fd,
- IOHandler *fd_read,
- IOHandler *fd_write,
- void *opaque)
+void qemu_set_fd_handler(int fd,
+ IOHandler *fd_read,
+ IOHandler *fd_write,
+ void *opaque)
{
abort();
}
--
2.4.0
- [Qemu-devel] [RFC PATCH v2 03/13] l2tpv3: Drop l2tpv3_can_send, (continued)
- [Qemu-devel] [RFC PATCH v2 03/13] l2tpv3: Drop l2tpv3_can_send, Fam Zheng, 2015/05/13
- [Qemu-devel] [RFC PATCH v2 04/13] netmap: Drop netmap_can_send, Fam Zheng, 2015/05/13
- [Qemu-devel] [RFC PATCH v2 05/13] net/socket: Drop net_socket_can_send, Fam Zheng, 2015/05/13
- [Qemu-devel] [RFC PATCH v2 06/13] tap: Drop tap_can_send, Fam Zheng, 2015/05/13
- [Qemu-devel] [RFC PATCH v2 07/13] Change qemu_set_fd_handler2(..., NULL, ...) to qemu_set_fd_handler, Fam Zheng, 2015/05/13
- [Qemu-devel] [RFC PATCH v2 08/13] main-loop: Drop qemu_set_fd_handler2, Fam Zheng, 2015/05/13
- [Qemu-devel] [RFC PATCH v2 09/13] alsaaudio: Remove unused error handling of qemu_set_fd_handler, Fam Zheng, 2015/05/13
- [Qemu-devel] [RFC PATCH v2 11/13] xen_backend: Remove unused error handling of qemu_set_fd_handler, Fam Zheng, 2015/05/13
- [Qemu-devel] [RFC PATCH v2 10/13] oss: Remove unused error handling of qemu_set_fd_handler, Fam Zheng, 2015/05/13
- [Qemu-devel] [RFC PATCH v2 12/13] event-notifier: Always return 0 for posix implementation, Fam Zheng, 2015/05/13
- [Qemu-devel] [RFC PATCH v2 13/13] iohandler: Use AioContext internally,
Fam Zheng <=
- Re: [Qemu-devel] [RFC PATCH v2 00/13] main-loop: Get rid of fd_read_poll and qemu_set_fd_handler2, Fam Zheng, 2015/05/14