/*
 * null engine
 *
 * IO engine that doesn't do any real IO transfers, it just pretends to.
 * The main purpose is to test fio itself.
 *
 * It also can act as external C++ engine - compiled with:
 *
 * g++ -O2 -g -shared -rdynamic -fPIC -o null.so null.c -DFIO_EXTERNAL_ENGINE
 *
 */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <assert.h>

#include "../fio.h"

struct null_data {
	struct io_u **io_us;
	int queued;
	int events;
};

static struct io_u *fio_null_event(struct thread_data *td, int event)
{
	struct null_data *nd = (struct null_data *) td->io_ops->data;

	return nd->io_us[event];
}

static int fio_null_getevents(struct thread_data *td, unsigned int min_events,
			      unsigned int fio_unused max,
			      const struct timespec fio_unused *t)
{
	struct null_data *nd = (struct null_data *) td->io_ops->data;
	int ret = 0;
	
	if (min_events) {
		ret = nd->events;
		nd->events = 0;
	}

	return ret;
}

static int fio_null_commit(struct thread_data *td)
{
	struct null_data *nd = (struct null_data *) td->io_ops->data;

	if (!nd->events) {
#ifndef FIO_EXTERNAL_ENGINE
		io_u_mark_submit(td, nd->queued);
#endif
		nd->events = nd->queued;
		nd->queued = 0;
	}

	return 0;
}

static int fio_null_queue(struct thread_data *td, struct io_u *io_u)
{
	struct null_data *nd = (struct null_data *) td->io_ops->data;

	fio_ro_check(td, io_u);

	if (td->io_ops->flags & FIO_SYNCIO)
		return FIO_Q_COMPLETED;
	if (nd->events)
		return FIO_Q_BUSY;

	nd->io_us[nd->queued++] = io_u;
	return FIO_Q_QUEUED;
}

static int fio_null_open(struct thread_data fio_unused *td,
			 struct fio_file fio_unused *f)
{
	return 0;
}

static void fio_null_cleanup(struct thread_data *td)
{
	struct null_data *nd = (struct null_data *) td->io_ops->data;

	if (nd) {
		if (nd->io_us)
			free(nd->io_us);
		free(nd);
	}
}

static int fio_null_init(struct thread_data *td)
{
	struct null_data *nd = (struct null_data *) malloc(sizeof(*nd));

	memset(nd, 0, sizeof(*nd));

	if (td->o.iodepth != 1) {
		nd->io_us = (struct io_u **) malloc(td->o.iodepth * sizeof(struct io_u *));
		memset(nd->io_us, 0, td->o.iodepth * sizeof(struct io_u *));
	} else
		td->io_ops->flags |= FIO_SYNCIO;

	td->io_ops->data = nd;
	return 0;
}

#ifndef __cplusplus
static struct ioengine_ops ioengine = {
	.name		= "null",
	.version	= FIO_IOOPS_VERSION,
	.queue		= fio_null_queue,
	.commit		= fio_null_commit,
	.getevents	= fio_null_getevents,
	.event		= fio_null_event,
	.init		= fio_null_init,
	.cleanup	= fio_null_cleanup,
	.open_file	= fio_null_open,
	.flags		= FIO_DISKLESSIO | FIO_FAKEIO,
};

static void fio_init fio_null_register(void)
{
	register_ioengine(&ioengine);
}

static void fio_exit fio_null_unregister(void)
{
	unregister_ioengine(&ioengine);
}

#else

#ifdef FIO_EXTERNAL_ENGINE
extern "C" {
void get_ioengine(struct ioengine_ops **ioengine_ptr)
{
	struct ioengine_ops *ioengine;

	*ioengine_ptr = (struct ioengine_ops *) malloc(sizeof(struct ioengine_ops));
	ioengine = *ioengine_ptr;

	strcpy(ioengine->name, "cpp_null");
	ioengine->version        = FIO_IOOPS_VERSION;
	ioengine->queue          = fio_null_queue;
	ioengine->commit         = fio_null_commit;
	ioengine->getevents      = fio_null_getevents;
	ioengine->event          = fio_null_event;
	ioengine->init           = fio_null_init;
	ioengine->cleanup        = fio_null_cleanup;
	ioengine->open_file      = fio_null_open;
	ioengine->flags	         = FIO_DISKLESSIO | FIO_FAKEIO;
}
}
#endif /* FIO_EXTERNAL_ENGINE */

#endif /* __cplusplus */
