#include <unistd.h>
#include <string.h>
#include <dlfcn.h>
+#include <assert.h>
#include "fio.h"
#include "os.h"
INIT_LIST_HEAD(&ops->list);
}
-int register_ioengine(struct ioengine_ops *ops)
+void register_ioengine(struct ioengine_ops *ops)
{
INIT_LIST_HEAD(&ops->list);
list_add_tail(&ops->list, &engine_list);
- return 0;
}
static struct ioengine_ops *find_ioengine(const char *name)
if (td->io_ops->dlhandle)
dlclose(td->io_ops->dlhandle);
+#if 0
+ /* we can't do this for threads, so just leak it, it's exiting */
free(td->io_ops);
+#endif
td->io_ops = NULL;
}
{
int ret;
- if (td->io_ops->flags & FIO_SYNCIO)
+ assert((io_u->flags & IO_U_F_FLIGHT) == 0);
+ io_u->flags |= IO_U_F_FLIGHT;
+
+ if (td->io_ops->flags & FIO_SYNCIO) {
fio_gettime(&io_u->issue_time, NULL);
+ /*
+ * for a sync engine, set the timeout upfront
+ */
+ if (mtime_since(&td->timeout_end, &io_u->issue_time) < IO_U_TIMEOUT)
+ io_u_set_timeout(td);
+ }
+
if (io_u->ddir != DDIR_SYNC)
td->io_issues[io_u->ddir]++;
ret = td->io_ops->queue(td, io_u);
- if ((td->io_ops->flags & FIO_SYNCIO) == 0)
+ if ((td->io_ops->flags & FIO_SYNCIO) == 0) {
fio_gettime(&io_u->issue_time, NULL);
+ /*
+ * async engine, set the timeout here
+ */
+ if (ret == FIO_Q_QUEUED &&
+ mtime_since(&td->timeout_end, &io_u->issue_time) < IO_U_TIMEOUT)
+ io_u_set_timeout(td);
+ }
+
return ret;
}