Statistics
| Branch: | Revision:

root / qemu-aio.h @ ff5928d0

History | View | Annotate | Download (2.1 kB)

1 a76bab49 aliguori
/*
2 a76bab49 aliguori
 * QEMU aio implementation
3 a76bab49 aliguori
 *
4 a76bab49 aliguori
 * Copyright IBM, Corp. 2008
5 a76bab49 aliguori
 *
6 a76bab49 aliguori
 * Authors:
7 a76bab49 aliguori
 *  Anthony Liguori   <aliguori@us.ibm.com>
8 a76bab49 aliguori
 *
9 a76bab49 aliguori
 * This work is licensed under the terms of the GNU GPL, version 2.  See
10 a76bab49 aliguori
 * the COPYING file in the top-level directory.
11 a76bab49 aliguori
 *
12 a76bab49 aliguori
 */
13 a76bab49 aliguori
14 a76bab49 aliguori
#ifndef QEMU_AIO_H
15 a76bab49 aliguori
#define QEMU_AIO_H
16 a76bab49 aliguori
17 a76bab49 aliguori
#include "qemu-common.h"
18 a76bab49 aliguori
#include "qemu-char.h"
19 a76bab49 aliguori
20 85e8dab1 Paolo Bonzini
typedef struct BlockDriverAIOCB BlockDriverAIOCB;
21 85e8dab1 Paolo Bonzini
typedef void BlockDriverCompletionFunc(void *opaque, int ret);
22 85e8dab1 Paolo Bonzini
23 85e8dab1 Paolo Bonzini
typedef struct AIOPool {
24 85e8dab1 Paolo Bonzini
    void (*cancel)(BlockDriverAIOCB *acb);
25 85e8dab1 Paolo Bonzini
    int aiocb_size;
26 85e8dab1 Paolo Bonzini
    BlockDriverAIOCB *free_aiocb;
27 85e8dab1 Paolo Bonzini
} AIOPool;
28 85e8dab1 Paolo Bonzini
29 85e8dab1 Paolo Bonzini
struct BlockDriverAIOCB {
30 85e8dab1 Paolo Bonzini
    AIOPool *pool;
31 85e8dab1 Paolo Bonzini
    BlockDriverState *bs;
32 85e8dab1 Paolo Bonzini
    BlockDriverCompletionFunc *cb;
33 85e8dab1 Paolo Bonzini
    void *opaque;
34 85e8dab1 Paolo Bonzini
    BlockDriverAIOCB *next;
35 85e8dab1 Paolo Bonzini
};
36 85e8dab1 Paolo Bonzini
37 85e8dab1 Paolo Bonzini
void *qemu_aio_get(AIOPool *pool, BlockDriverState *bs,
38 85e8dab1 Paolo Bonzini
                   BlockDriverCompletionFunc *cb, void *opaque);
39 85e8dab1 Paolo Bonzini
void qemu_aio_release(void *p);
40 85e8dab1 Paolo Bonzini
41 a76bab49 aliguori
/* Returns 1 if there are still outstanding AIO requests; 0 otherwise */
42 a76bab49 aliguori
typedef int (AioFlushHandler)(void *opaque);
43 a76bab49 aliguori
44 a76bab49 aliguori
/* Flush any pending AIO operation. This function will block until all
45 a76bab49 aliguori
 * outstanding AIO operations have been completed or cancelled. */
46 a76bab49 aliguori
void qemu_aio_flush(void);
47 a76bab49 aliguori
48 986c28d6 Andrea Arcangeli
/* Wait for a single AIO completion to occur.  This function will wait
49 986c28d6 Andrea Arcangeli
 * until a single AIO event has completed and it will ensure something
50 986c28d6 Andrea Arcangeli
 * has moved before returning. This can issue new pending aio as
51 bcdc1857 Paolo Bonzini
 * result of executing I/O completion or bh callbacks.
52 bcdc1857 Paolo Bonzini
 *
53 bcdc1857 Paolo Bonzini
 * Return whether there is still any pending AIO operation.  */
54 bcdc1857 Paolo Bonzini
bool qemu_aio_wait(void);
55 a76bab49 aliguori
56 a76bab49 aliguori
/* Register a file descriptor and associated callbacks.  Behaves very similarly
57 a76bab49 aliguori
 * to qemu_set_fd_handler2.  Unlike qemu_set_fd_handler2, these callbacks will
58 a76bab49 aliguori
 * be invoked when using either qemu_aio_wait() or qemu_aio_flush().
59 a76bab49 aliguori
 *
60 a76bab49 aliguori
 * Code that invokes AIO completion functions should rely on this function
61 a76bab49 aliguori
 * instead of qemu_set_fd_handler[2].
62 a76bab49 aliguori
 */
63 a76bab49 aliguori
int qemu_aio_set_fd_handler(int fd,
64 a76bab49 aliguori
                            IOHandler *io_read,
65 a76bab49 aliguori
                            IOHandler *io_write,
66 a76bab49 aliguori
                            AioFlushHandler *io_flush,
67 a76bab49 aliguori
                            void *opaque);
68 a76bab49 aliguori
69 a76bab49 aliguori
#endif