#include "fio.h"
#include "profile.h"
#include "debug.h"
#include "flist.h"
#include "options.h"

static FLIST_HEAD(profile_list);

struct profile_ops *find_profile(const char *profile)
{
	struct profile_ops *ops = NULL;
	struct flist_head *n;

	flist_for_each(n, &profile_list) {
		ops = flist_entry(n, struct profile_ops, list);
		if (!strcmp(profile, ops->name))
			break;

		ops = NULL;
	}

	return ops;
}

int load_profile(const char *profile)
{
	struct profile_ops *ops;

	dprint(FD_PROFILE, "loading profile '%s'\n", profile);

	ops = find_profile(profile);
	if (ops) {
		ops->prep_cmd();
		add_job_opts(ops->cmdline);
		return 0;
	}

	log_err("fio: profile '%s' not found\n", profile);
	return 1;
}

static int add_profile_options(struct profile_ops *ops)
{
	struct fio_option *o;
	
	if (!ops->options)
		return 0;

	o = ops->options;
	while (o->name) {
		o->prof_name = ops->name;
		if (add_option(o))
			return 1;
		o++;
	}

	return 0;
}

int register_profile(struct profile_ops *ops)
{
	int ret;

	dprint(FD_PROFILE, "register profile '%s'\n", ops->name);

	ret = add_profile_options(ops);
	if (!ret) {
		flist_add_tail(&ops->list, &profile_list);
		add_opt_posval("profile", ops->name, ops->desc);
		return 0;
	}

	invalidate_profile_options(ops->name);
	return ret;
}

void unregister_profile(struct profile_ops *ops)
{
	dprint(FD_PROFILE, "unregister profile '%s'\n", ops->name);
	flist_del(&ops->list);
	invalidate_profile_options(ops->name);
	del_opt_posval("profile", ops->name);
}

void profile_add_hooks(struct thread_data *td)
{
	struct profile_ops *ops;

	if (!exec_profile)
		return;

	ops = find_profile(exec_profile);
	if (!ops)
		return;

	if (ops->io_ops)
		td->prof_io_ops = *ops->io_ops;
}

int profile_td_init(struct thread_data *td)
{
	struct prof_io_ops *ops = &td->prof_io_ops;

	if (ops->td_init)
		return ops->td_init(td);

	return 0;
}

void profile_td_exit(struct thread_data *td)
{
	struct prof_io_ops *ops = &td->prof_io_ops;

	if (ops->td_exit)
		ops->td_exit(td);
}
