From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39653) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Ysjvt-0004x0-4C for qemu-devel@nongnu.org; Wed, 13 May 2015 23:35:38 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Ysjvp-0007hF-Og for qemu-devel@nongnu.org; Wed, 13 May 2015 23:35:37 -0400 Received: from mx1.redhat.com ([209.132.183.28]:49459) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Ysjvp-0007go-I0 for qemu-devel@nongnu.org; Wed, 13 May 2015 23:35:33 -0400 From: Fam Zheng Date: Thu, 14 May 2015 11:34:29 +0800 Message-Id: <1431574469-9605-14-git-send-email-famz@redhat.com> In-Reply-To: <1431574469-9605-1-git-send-email-famz@redhat.com> References: <1431574469-9605-1-git-send-email-famz@redhat.com> Subject: [Qemu-devel] [RFC PATCH v2 13/13] iohandler: Use AioContext internally List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Kevin Wolf , Jason Wang , Vincenzo Maffione , Stefan Hajnoczi , Paolo Bonzini , Giuseppe Lettieri , Luigi Rizzo 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 --- 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 #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