int count, wptr, rptr;
} QEMUFIFO;
-int qemu_fifo_write(QEMUFIFO *f, const uint8_t *buf, int len1)
+static int qemu_fifo_write(QEMUFIFO *f, const uint8_t *buf, int len1)
{
int l, len;
return len1;
}
-int qemu_fifo_read(QEMUFIFO *f, uint8_t *buf, int len1)
+static int qemu_fifo_read(QEMUFIFO *f, uint8_t *buf, int len1)
{
int l, len;
#include <pthread.h>
#include <unistd.h>
#include <errno.h>
+#include <assert.h>
#include <sys/time.h>
#include "osdep.h"
while (offset < aiocb->aio_nbytes) {
ssize_t len;
- if (aiocb->is_write)
- len = pwrite(aiocb->aio_fildes,
- (const char *)aiocb->aio_buf + offset,
+ len = aiocb->function(aiocb->aio_fildes,
+ aiocb->aio_buf + offset,
aiocb->aio_nbytes - offset,
aiocb->aio_offset + offset);
- else
- len = pread(aiocb->aio_fildes,
- (char *)aiocb->aio_buf + offset,
- aiocb->aio_nbytes - offset,
- aiocb->aio_offset + offset);
if (len == -1 && errno == EINTR)
continue;
return 0;
}
-static int qemu_paio_submit(struct qemu_paiocb *aiocb, int is_write)
+static int qemu_paio_submit(struct qemu_paiocb *aiocb, qemu_paio_function fn)
{
- aiocb->is_write = is_write;
+ aiocb->function = fn;
aiocb->ret = -EINPROGRESS;
aiocb->active = 0;
pthread_mutex_lock(&lock);
int qemu_paio_read(struct qemu_paiocb *aiocb)
{
- return qemu_paio_submit(aiocb, 0);
+ return qemu_paio_submit(aiocb, pread);
}
int qemu_paio_write(struct qemu_paiocb *aiocb)
{
- return qemu_paio_submit(aiocb, 1);
+ return qemu_paio_submit(aiocb, (qemu_paio_function*)pwrite);
+}
+
+static ssize_t fsync_like_pwrite(int fd, void *buf,
+ size_t count, off_t offset) {
+ assert(count==1);
+ assert(offset==0);
+ return fsync(fd) ? -1 : 1;
+}
+int qemu_paio_fsync(struct qemu_paiocb *aiocb)
+{
+ assert(aiocb->aio_offset==0);
+ assert(aiocb->aio_buf==0);
+ aiocb->aio_nbytes = 1;
+ return qemu_paio_submit(aiocb, fsync_like_pwrite);
}
ssize_t qemu_paio_return(struct qemu_paiocb *aiocb)
#define QEMU_PAIO_NOTCANCELED 0x02
#define QEMU_PAIO_ALLDONE 0x03
+typedef ssize_t qemu_paio_function(int fd, void *buf,
+ size_t count, off_t offset);
+
struct qemu_paiocb
{
int aio_fildes;
/* private */
TAILQ_ENTRY(qemu_paiocb) node;
- int is_write;
+ qemu_paio_function *function;
ssize_t ret;
int active;
};
int qemu_paio_read(struct qemu_paiocb *aiocb);
int qemu_paio_write(struct qemu_paiocb *aiocb);
int qemu_paio_error(struct qemu_paiocb *aiocb);
+int qemu_paio_fsync(struct qemu_paiocb *aiocb);
ssize_t qemu_paio_return(struct qemu_paiocb *aiocb);
int qemu_paio_cancel(int fd, struct qemu_paiocb *aiocb);