mirror of https://gitee.com/openkylin/qemu.git
aio: provide platform-independent API
This adds to aio.c a platform-independent API based on EventNotifiers, that can be used by both POSIX and Win32. Reviewed-by: Anthony Liguori <aliguori@us.ibm.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
b078dc3cfe
commit
9958c351ee
|
@ -46,6 +46,8 @@ block-obj-y += nbd.o block.o blockjob.o aio.o aes.o qemu-config.o
|
|||
block-obj-y += qemu-progress.o qemu-sockets.o uri.o notify.o
|
||||
block-obj-y += $(coroutine-obj-y) $(qobject-obj-y) $(version-obj-y)
|
||||
block-obj-$(CONFIG_POSIX) += posix-aio-compat.o
|
||||
block-obj-$(CONFIG_POSIX) += event_notifier-posix.o
|
||||
block-obj-$(CONFIG_WIN32) += event_notifier-win32.o
|
||||
block-obj-$(CONFIG_LINUX_AIO) += linux-aio.o
|
||||
block-obj-y += block/
|
||||
block-obj-y += $(qapi-obj-y) qapi-types.o qapi-visit.o
|
||||
|
@ -94,8 +96,6 @@ common-obj-y += bt-host.o bt-vhci.o
|
|||
common-obj-y += dma-helpers.o
|
||||
common-obj-y += acl.o
|
||||
common-obj-$(CONFIG_POSIX) += compatfd.o
|
||||
common-obj-$(CONFIG_POSIX) += event_notifier-posix.o
|
||||
common-obj-$(CONFIG_WIN32) += event_notifier-win32.o
|
||||
common-obj-y += qemu-timer.o qemu-timer-common.o
|
||||
common-obj-y += qtest.o
|
||||
common-obj-y += vl.o
|
||||
|
|
9
aio.c
9
aio.c
|
@ -95,6 +95,15 @@ void qemu_aio_set_fd_handler(int fd,
|
|||
qemu_set_fd_handler2(fd, NULL, io_read, io_write, opaque);
|
||||
}
|
||||
|
||||
void qemu_aio_set_event_notifier(EventNotifier *notifier,
|
||||
EventNotifierHandler *io_read,
|
||||
AioFlushEventNotifierHandler *io_flush)
|
||||
{
|
||||
qemu_aio_set_fd_handler(event_notifier_get_fd(notifier),
|
||||
(IOHandler *)io_read, NULL,
|
||||
(AioFlushHandler *)io_flush, notifier);
|
||||
}
|
||||
|
||||
void qemu_aio_flush(void)
|
||||
{
|
||||
while (qemu_aio_wait());
|
||||
|
|
19
qemu-aio.h
19
qemu-aio.h
|
@ -16,6 +16,7 @@
|
|||
|
||||
#include "qemu-common.h"
|
||||
#include "qemu-char.h"
|
||||
#include "event_notifier.h"
|
||||
|
||||
typedef struct BlockDriverAIOCB BlockDriverAIOCB;
|
||||
typedef void BlockDriverCompletionFunc(void *opaque, int ret);
|
||||
|
@ -39,7 +40,7 @@ void *qemu_aio_get(AIOPool *pool, BlockDriverState *bs,
|
|||
void qemu_aio_release(void *p);
|
||||
|
||||
/* Returns 1 if there are still outstanding AIO requests; 0 otherwise */
|
||||
typedef int (AioFlushHandler)(void *opaque);
|
||||
typedef int (AioFlushEventNotifierHandler)(EventNotifier *e);
|
||||
|
||||
/* Flush any pending AIO operation. This function will block until all
|
||||
* outstanding AIO operations have been completed or cancelled. */
|
||||
|
@ -53,6 +54,10 @@ void qemu_aio_flush(void);
|
|||
* Return whether there is still any pending AIO operation. */
|
||||
bool qemu_aio_wait(void);
|
||||
|
||||
#ifdef CONFIG_POSIX
|
||||
/* Returns 1 if there are still outstanding AIO requests; 0 otherwise */
|
||||
typedef int (AioFlushHandler)(void *opaque);
|
||||
|
||||
/* Register a file descriptor and associated callbacks. Behaves very similarly
|
||||
* to qemu_set_fd_handler2. Unlike qemu_set_fd_handler2, these callbacks will
|
||||
* be invoked when using either qemu_aio_wait() or qemu_aio_flush().
|
||||
|
@ -65,5 +70,17 @@ void qemu_aio_set_fd_handler(int fd,
|
|||
IOHandler *io_write,
|
||||
AioFlushHandler *io_flush,
|
||||
void *opaque);
|
||||
#endif
|
||||
|
||||
/* Register an event notifier and associated callbacks. Behaves very similarly
|
||||
* to event_notifier_set_handler. Unlike event_notifier_set_handler, these callbacks
|
||||
* will be invoked when using either qemu_aio_wait() or qemu_aio_flush().
|
||||
*
|
||||
* Code that invokes AIO completion functions should rely on this function
|
||||
* instead of event_notifier_set_handler.
|
||||
*/
|
||||
void qemu_aio_set_event_notifier(EventNotifier *notifier,
|
||||
EventNotifierHandler *io_read,
|
||||
AioFlushEventNotifierHandler *io_flush);
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue