mirror of
https://git.proxmox.com/git/qemu
synced 2025-08-08 04:15:36 +00:00
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 += qemu-progress.o qemu-sockets.o uri.o notify.o
|
||||||
block-obj-y += $(coroutine-obj-y) $(qobject-obj-y) $(version-obj-y)
|
block-obj-y += $(coroutine-obj-y) $(qobject-obj-y) $(version-obj-y)
|
||||||
block-obj-$(CONFIG_POSIX) += posix-aio-compat.o
|
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-$(CONFIG_LINUX_AIO) += linux-aio.o
|
||||||
block-obj-y += block/
|
block-obj-y += block/
|
||||||
block-obj-y += $(qapi-obj-y) qapi-types.o qapi-visit.o
|
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 += dma-helpers.o
|
||||||
common-obj-y += acl.o
|
common-obj-y += acl.o
|
||||||
common-obj-$(CONFIG_POSIX) += compatfd.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 += qemu-timer.o qemu-timer-common.o
|
||||||
common-obj-y += qtest.o
|
common-obj-y += qtest.o
|
||||||
common-obj-y += vl.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);
|
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)
|
void qemu_aio_flush(void)
|
||||||
{
|
{
|
||||||
while (qemu_aio_wait());
|
while (qemu_aio_wait());
|
||||||
|
19
qemu-aio.h
19
qemu-aio.h
@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
#include "qemu-common.h"
|
#include "qemu-common.h"
|
||||||
#include "qemu-char.h"
|
#include "qemu-char.h"
|
||||||
|
#include "event_notifier.h"
|
||||||
|
|
||||||
typedef struct BlockDriverAIOCB BlockDriverAIOCB;
|
typedef struct BlockDriverAIOCB BlockDriverAIOCB;
|
||||||
typedef void BlockDriverCompletionFunc(void *opaque, int ret);
|
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);
|
void qemu_aio_release(void *p);
|
||||||
|
|
||||||
/* Returns 1 if there are still outstanding AIO requests; 0 otherwise */
|
/* 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
|
/* Flush any pending AIO operation. This function will block until all
|
||||||
* outstanding AIO operations have been completed or cancelled. */
|
* 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. */
|
* Return whether there is still any pending AIO operation. */
|
||||||
bool qemu_aio_wait(void);
|
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
|
/* Register a file descriptor and associated callbacks. Behaves very similarly
|
||||||
* to qemu_set_fd_handler2. Unlike qemu_set_fd_handler2, these callbacks will
|
* 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().
|
* 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,
|
IOHandler *io_write,
|
||||||
AioFlushHandler *io_flush,
|
AioFlushHandler *io_flush,
|
||||||
void *opaque);
|
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
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user