[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v2 25/39] aio: add aio_notify
From: |
Paolo Bonzini |
Subject: |
[Qemu-devel] [PATCH v2 25/39] aio: add aio_notify |
Date: |
Wed, 31 Oct 2012 16:30:42 +0100 |
With this change async.c does not rely anymore on any service from
main-loop.c, i.e. it is completely self-contained.
Reviewed-by: Anthony Liguori <address@hidden>
Signed-off-by: Paolo Bonzini <address@hidden>
---
async.c | 30 ++++++++++++++++++++++++++----
qemu-aio.h | 18 ++++++++++++++++++
2 file modificati, 44 inserzioni(+), 4 rimozioni(-)
diff --git a/async.c b/async.c
index 4ffdd98..564526f 100644
--- a/async.c
+++ b/async.c
@@ -30,6 +30,7 @@
/* bottom halves (can be seen as timers which expire ASAP) */
struct QEMUBH {
+ AioContext *ctx;
QEMUBHFunc *cb;
void *opaque;
QEMUBH *next;
@@ -42,6 +43,7 @@ QEMUBH *aio_bh_new(AioContext *ctx, QEMUBHFunc *cb, void
*opaque)
{
QEMUBH *bh;
bh = g_malloc0(sizeof(QEMUBH));
+ bh->ctx = ctx;
bh->cb = cb;
bh->opaque = opaque;
bh->next = ctx->first_bh;
@@ -101,8 +103,7 @@ void qemu_bh_schedule(QEMUBH *bh)
return;
bh->scheduled = 1;
bh->idle = 0;
- /* stop the currently executing CPU to execute the BH ASAP */
- qemu_notify_event();
+ aio_notify(bh->ctx);
}
void qemu_bh_cancel(QEMUBH *bh)
@@ -177,11 +178,20 @@ aio_ctx_dispatch(GSource *source,
return true;
}
+static void
+aio_ctx_finalize(GSource *source)
+{
+ AioContext *ctx = (AioContext *) source;
+
+ aio_set_event_notifier(ctx, &ctx->notifier, NULL, NULL);
+ event_notifier_cleanup(&ctx->notifier);
+}
+
static GSourceFuncs aio_source_funcs = {
aio_ctx_prepare,
aio_ctx_check,
aio_ctx_dispatch,
- NULL
+ aio_ctx_finalize
};
GSource *aio_get_g_source(AioContext *ctx)
@@ -190,9 +200,21 @@ GSource *aio_get_g_source(AioContext *ctx)
return &ctx->source;
}
+void aio_notify(AioContext *ctx)
+{
+ event_notifier_set(&ctx->notifier);
+}
+
AioContext *aio_context_new(void)
{
- return (AioContext *) g_source_new(&aio_source_funcs, sizeof(AioContext));
+ AioContext *ctx;
+ ctx = (AioContext *) g_source_new(&aio_source_funcs, sizeof(AioContext));
+ event_notifier_init(&ctx->notifier, false);
+ aio_set_event_notifier(ctx, &ctx->notifier,
+ (EventNotifierHandler *)
+ event_notifier_test_and_clear, NULL);
+
+ return ctx;
}
void aio_context_ref(AioContext *ctx)
diff --git a/qemu-aio.h b/qemu-aio.h
index aedf66c..2354617 100644
--- a/qemu-aio.h
+++ b/qemu-aio.h
@@ -62,6 +62,9 @@ typedef struct AioContext {
* no callbacks are removed while we're walking and dispatching callbacks.
*/
int walking_bh;
+
+ /* Used for aio_notify. */
+ EventNotifier notifier;
} AioContext;
/* Returns 1 if there are still outstanding AIO requests; 0 otherwise */
@@ -102,6 +105,21 @@ void aio_context_unref(AioContext *ctx);
QEMUBH *aio_bh_new(AioContext *ctx, QEMUBHFunc *cb, void *opaque);
/**
+ * aio_notify: Force processing of pending events.
+ *
+ * Similar to signaling a condition variable, aio_notify forces
+ * aio_wait to exit, so that the next call will re-examine pending events.
+ * The caller of aio_notify will usually call aio_wait again very soon,
+ * or go through another iteration of the GLib main loop. Hence, aio_notify
+ * also has the side effect of recalculating the sets of file descriptors
+ * that the main loop waits for.
+ *
+ * Calling aio_notify is rarely necessary, because for example scheduling
+ * a bottom half calls it already.
+ */
+void aio_notify(AioContext *ctx);
+
+/**
* aio_bh_poll: Poll bottom halves for an AioContext.
*
* These are internal functions used by the QEMU main loop.
--
1.7.12.1
- [Qemu-devel] [PATCH v2 08/39] qemu-timer: make initialization functions idempotent, (continued)
- [Qemu-devel] [PATCH v2 08/39] qemu-timer: make initialization functions idempotent, Paolo Bonzini, 2012/10/31
- [Qemu-devel] [PATCH v2 09/39] main-loop: unify qemu_init_main_loop between QEMU and tools, Paolo Bonzini, 2012/10/31
- [Qemu-devel] [PATCH v2 10/39] qemu-tool: do not depend on qemu-timer.c, Paolo Bonzini, 2012/10/31
- [Qemu-devel] [PATCH v2 11/39] build: opts-visitor is not really part of QAPI, Paolo Bonzini, 2012/10/31
- [Qemu-devel] [PATCH v2 12/39] build: do not include main loop where it is not actually used, Paolo Bonzini, 2012/10/31
- [Qemu-devel] [PATCH v2 17/39] aio: provide platform-independent API, Paolo Bonzini, 2012/10/31
- [Qemu-devel] [PATCH v2 20/39] aio: test node->deleted before calling io_flush, Paolo Bonzini, 2012/10/31
- [Qemu-devel] [PATCH v2 21/39] aio: add non-blocking variant of aio_wait, Paolo Bonzini, 2012/10/31
- [Qemu-devel] [PATCH v2 23/39] aio: add Win32 implementation, Paolo Bonzini, 2012/10/31
- [Qemu-devel] [PATCH v2 22/39] aio: prepare for introducing GSource-based dispatch, Paolo Bonzini, 2012/10/31
- [Qemu-devel] [PATCH v2 25/39] aio: add aio_notify,
Paolo Bonzini <=
- [Qemu-devel] [PATCH v2 24/39] aio: make AioContexts GSources, Paolo Bonzini, 2012/10/31
- [Qemu-devel] [PATCH v2 27/39] main-loop: use GSource to poll AIO file descriptors, Paolo Bonzini, 2012/10/31
- [Qemu-devel] [PATCH v2 29/39] aio: clean up now-unused functions, Paolo Bonzini, 2012/10/31
- [Qemu-devel] [PATCH v2 33/39] threadpool: do not take lock in event_notifier_ready, Paolo Bonzini, 2012/10/31
- [Qemu-devel] [PATCH v2 32/39] aio: add generic thread-pool facility, Paolo Bonzini, 2012/10/31
- [Qemu-devel] [PATCH v2 34/39] block: switch posix-aio-compat to threadpool, Paolo Bonzini, 2012/10/31
- [Qemu-devel] [PATCH v2 35/39] raw: merge posix-aio-compat.c into block/raw-posix.c, Paolo Bonzini, 2012/10/31
- [Qemu-devel] [PATCH v2 36/39] raw-posix: rename raw-posix-aio.h, hide unavailable prototypes, Paolo Bonzini, 2012/10/31
- [Qemu-devel] [PATCH v2 37/39] raw-win32: add emulated AIO support, Paolo Bonzini, 2012/10/31
- [Qemu-devel] [PATCH v2 30/39] linux-aio: use event notifiers, Paolo Bonzini, 2012/10/31