/**
 * @file opd_extended.h
 * OProfile Extended Feature
 *
 * @remark Copyright 2007-2009 OProfile authors
 * @remark Read the file COPYING
 *
 * @author Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
 * Copyright (c) 2009 Advanced Micro Devices, Inc.
 */

#ifndef OPD_EXTENDED_H
#define OPD_EXTENDED_H

#include "opd_trans.h"
#include "odb.h"

#include <stdlib.h>
#include <stdint.h>


/**
 * OProfile Extended Feature Table Entry
 */
struct opd_ext_feature {
	// Feature name
	const char* feature;
	// Feature handlers
	struct opd_ext_handlers * handlers;
};

/**
 * OProfile Extended handlers
 */
struct opd_ext_handlers {
	// Extended init
	int (*ext_init)(char const *);
	// Extended statistics
	int (*ext_print_stats)();
	// Extended sfile handlers
	struct opd_ext_sfile_handlers * ext_sfile;
};

/**
 * OProfile Extended sub-handlers (sfile)
 */
struct opd_ext_sfile_handlers {
	int (*create)(struct sfile *);
	int (*dup)(struct sfile *, struct sfile *);
	int (*close)(struct sfile *);
	int (*sync)(struct sfile *);
	odb_t * (*get)(struct transient const *, int);
	struct opd_event * (*find_counter_event)(unsigned long);
};

/**
 * @param value: commandline input option string
 *
 * Parse the specified extended feature
 */
extern int opd_ext_initialize(char const * value);

/**
 * Print out extended feature statistics in oprofiled.log file
 */
extern void opd_ext_print_stats();

/**
 * opd_sfile extended sfile handling functions
 */
extern void opd_ext_sfile_create(struct sfile * sf);
extern void opd_ext_sfile_dup (struct sfile * to, struct sfile * from);
extern void opd_ext_sfile_close(struct sfile * sf);
extern void opd_ext_sfile_sync(struct sfile * sf);
extern odb_t * opd_ext_sfile_get(struct transient const * trans, int is_cg);

/**
 * @param counter: counter index
 *
 * Get event struct opd_event from the counter index value.
 */
extern struct opd_event * opd_ext_find_counter_event(unsigned long counter);


#endif