Add support for blkin tracing in rbd engine
[fio.git] / engines / windowsaio.c
index f32c3563dcc50417930829c253a558159ff174e7..cbbed6a0cf19603022b39ef7179585932d4f0317 100644 (file)
@@ -9,7 +9,6 @@
 #include <unistd.h>
 #include <signal.h>
 #include <errno.h>
-#include <windows.h>
 
 #include "../fio.h"
 
@@ -38,7 +37,7 @@ struct thread_ctx {
 
 static BOOL timeout_expired(DWORD start_count, DWORD end_count);
 static int fio_windowsaio_getevents(struct thread_data *td, unsigned int min,
-                                       unsigned int max, struct timespec *t);
+                               unsigned int max, const struct timespec *t);
 static struct io_u *fio_windowsaio_event(struct thread_data *td, int event);
 static int fio_windowsaio_queue(struct thread_data *td,
                                  struct io_u *io_u);
@@ -257,12 +256,13 @@ static struct io_u* fio_windowsaio_event(struct thread_data *td, int event)
 }
 
 static int fio_windowsaio_getevents(struct thread_data *td, unsigned int min,
-                                       unsigned int max, struct timespec *t)
+                                   unsigned int max,
+                                   const struct timespec *t)
 {
        struct windowsaio_data *wd = td->io_ops->data;
-       struct flist_head *entry;
        unsigned int dequeued = 0;
        struct io_u *io_u;
+       int i;
        struct fio_overlapped *fov;
        DWORD start_count = 0;
        DWORD end_count = 0;
@@ -276,20 +276,21 @@ static int fio_windowsaio_getevents(struct thread_data *td, unsigned int min,
        }
 
        do {
-               flist_for_each(entry, &td->io_u_busylist) {
-                       io_u = flist_entry(entry, struct io_u, list);
+               io_u_qiter(&td->io_u_all, io_u, i) {
+                       if (!(io_u->flags & IO_U_F_FLIGHT))
+                               continue;
+
                        fov = (struct fio_overlapped*)io_u->engine_data;
 
                        if (fov->io_complete) {
                                fov->io_complete = FALSE;
-                               ResetEvent(fov->o.hEvent);
                                wd->aio_events[dequeued] = io_u;
                                dequeued++;
                        }
 
-                       if (dequeued >= min)
-                               break;
                }
+               if (dequeued >= min)
+                       break;
 
                if (dequeued < min) {
                        status = WaitForSingleObject(wd->iocomplete_event, mswait);
@@ -308,23 +309,22 @@ static int fio_windowsaio_queue(struct thread_data *td, struct io_u *io_u)
 {
        struct fio_overlapped *o = io_u->engine_data;
        LPOVERLAPPED lpOvl = &o->o;
-       DWORD iobytes;
        BOOL success = FALSE;
        int rc = FIO_Q_COMPLETED;
 
        fio_ro_check(td, io_u);
 
-       lpOvl->Internal = STATUS_PENDING;
+       lpOvl->Internal = 0;
        lpOvl->InternalHigh = 0;
        lpOvl->Offset = io_u->offset & 0xFFFFFFFF;
        lpOvl->OffsetHigh = io_u->offset >> 32;
 
        switch (io_u->ddir) {
        case DDIR_WRITE:
-               success = WriteFile(io_u->file->hFile, io_u->xfer_buf, io_u->xfer_buflen, &iobytes, lpOvl);
+               success = WriteFile(io_u->file->hFile, io_u->xfer_buf, io_u->xfer_buflen, NULL, lpOvl);
                break;
        case DDIR_READ:
-               success = ReadFile(io_u->file->hFile, io_u->xfer_buf, io_u->xfer_buflen, &iobytes, lpOvl);
+               success = ReadFile(io_u->file->hFile, io_u->xfer_buf, io_u->xfer_buflen, NULL, lpOvl);
                break;
        case DDIR_SYNC:
        case DDIR_DATASYNC:
@@ -401,7 +401,6 @@ static void fio_windowsaio_io_u_free(struct thread_data *td, struct io_u *io_u)
        struct fio_overlapped *o = io_u->engine_data;
 
        if (o) {
-               CloseHandle(o->o.hEvent);
                io_u->engine_data = NULL;
                free(o);
        }
@@ -414,13 +413,7 @@ static int fio_windowsaio_io_u_init(struct thread_data *td, struct io_u *io_u)
        o = malloc(sizeof(*o));
        o->io_complete = FALSE;
        o->io_u = io_u;
-       o->o.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
-       if (o->o.hEvent == NULL) {
-               log_err("windowsaio: failed to create event handle\n");
-               free(o);
-               return 1;
-       }
-
+       o->o.hEvent = NULL;
        io_u->engine_data = o;
        return 0;
 }