Home | History | Annotate | Download | only in daemon
      1 /**
      2  * @file opd_extended.c
      3  * OProfile Extended Feature
      4  *
      5  * @remark Copyright 2007-2009 OProfile authors
      6  * @remark Read the file COPYING
      7  *
      8  * @author Suravee Suthikulpanit <suravee.suthikulpanit (at) amd.com>
      9  * Copyright (c) 2009 Advanced Micro Devices, Inc.
     10  */
     11 
     12 #include "opd_extended.h"
     13 #include "op_string.h"
     14 
     15 #include <string.h>
     16 #include <stdio.h>
     17 
     18 /* This global variable is >= 0
     19  * if extended feature is enabled */
     20 static int opd_ext_feat_index;
     21 
     22 extern struct opd_ext_handlers ibs_handlers;
     23 
     24 /**
     25  * OProfile Extended Feature Table
     26  *
     27  * This table contains a list of extended features.
     28  */
     29 static struct opd_ext_feature ext_feature_table[] = {
     30 	{"ibs", &ibs_handlers },
     31 	{ NULL, NULL }
     32 };
     33 
     34 
     35 static int get_index_for_feature(char const * name)
     36 {
     37 	int ret = -1;
     38 	unsigned int i;
     39 
     40 	if(!name)
     41 		return ret;
     42 
     43 	for (i = 0 ; ext_feature_table[i].feature != NULL ; i++ ) {
     44 		if(!strncmp(name, ext_feature_table[i].feature,
     45 			strlen(ext_feature_table[i].feature))) {
     46 			ret = i;
     47 			break;
     48 		}
     49 	}
     50 
     51 	return ret;
     52 }
     53 
     54 
     55 static inline int is_ext_enabled()
     56 {
     57 	if (opd_ext_feat_index >= 0
     58 	&& ext_feature_table[opd_ext_feat_index].handlers != NULL)
     59 		return 1;
     60 	else
     61 		return 0;
     62 }
     63 
     64 
     65 static inline int is_ext_sfile_enabled()
     66 {
     67 	if (opd_ext_feat_index >= 0
     68 	&& ext_feature_table[opd_ext_feat_index].handlers != NULL
     69 	&& ext_feature_table[opd_ext_feat_index].handlers->ext_sfile != NULL)
     70 		return 1;
     71 	else
     72 		return 0;
     73 }
     74 
     75 
     76 /**
     77  * Param "value" is the input from CML option with the format:
     78  *
     79  * <feature name>:<param1>:<param2>:<param3>:.....
     80  *
     81  * where param1,2.3,..n are optional.
     82  */
     83 int opd_ext_initialize(char const * value)
     84 {
     85 	int ret = EXIT_FAILURE;
     86 	char * tmp = NULL, * name = NULL, * args = NULL;
     87 
     88 	if(!value) {
     89 		opd_ext_feat_index = -1;
     90 		return 0;
     91 	}
     92 
     93 	tmp = op_xstrndup(value, strlen(value));
     94 
     95 	/* Parse feature name*/
     96 	if((name = strtok_r(tmp, ":", &args)) == NULL)
     97 		goto err_out;
     98 
     99 	if((opd_ext_feat_index = get_index_for_feature(name)) < 0)
    100 		goto err_out;
    101 
    102 	ret = ext_feature_table[opd_ext_feat_index].handlers->ext_init(args);
    103 
    104 	return ret;
    105 
    106 err_out:
    107 	fprintf(stderr,"opd_ext_initialize: Invalid extended feature option: %s\n", value);
    108 	return ret;
    109 }
    110 
    111 
    112 int opd_ext_deinitialize()
    113 {
    114 	int ret = EXIT_FAILURE;
    115 
    116 	if(opd_ext_feat_index == -1) {
    117 		return 0;
    118 	}
    119 
    120 	ret = ext_feature_table[opd_ext_feat_index].handlers->ext_deinit();
    121 
    122 	return ret;
    123 }
    124 
    125 
    126 void opd_ext_print_stats()
    127 {
    128 	if (is_ext_enabled()
    129 	&& ext_feature_table[opd_ext_feat_index].handlers->ext_print_stats != NULL) {
    130 		printf("\n-- OProfile Extended-Feature Statistics --\n");
    131 		ext_feature_table[opd_ext_feat_index].handlers->ext_print_stats();
    132 	}
    133 }
    134 
    135 
    136 /**
    137  * opd_sfile extended APIs
    138  */
    139 void opd_ext_sfile_create(struct sfile * sf)
    140 {
    141 	/* Creating ext sfile only if extended feature is enable*/
    142 	if (is_ext_sfile_enabled()
    143 	&& ext_feature_table[opd_ext_feat_index].handlers->ext_sfile->create != NULL)
    144 		ext_feature_table[opd_ext_feat_index].handlers->ext_sfile->create(sf);
    145 }
    146 
    147 
    148 void opd_ext_sfile_dup (struct sfile * to, struct sfile * from)
    149 {
    150 	/* Duplicate ext sfile only if extended feature is enable*/
    151 	if (is_ext_sfile_enabled()
    152 	&& ext_feature_table[opd_ext_feat_index].handlers->ext_sfile->dup != NULL)
    153 		ext_feature_table[opd_ext_feat_index].handlers->ext_sfile->dup(to, from);
    154 }
    155 
    156 
    157 void opd_ext_sfile_close (struct sfile * sf)
    158 {
    159 	/* Close ext sfile only if extended feature is enable*/
    160 	if (is_ext_sfile_enabled()
    161 	&& ext_feature_table[opd_ext_feat_index].handlers->ext_sfile->close != NULL)
    162 		ext_feature_table[opd_ext_feat_index].handlers->ext_sfile->close(sf);
    163 }
    164 
    165 
    166 void opd_ext_sfile_sync(struct sfile * sf)
    167 {
    168 	/* Sync ext sfile only if extended feature is enable*/
    169 	if (is_ext_sfile_enabled()
    170 	&& ext_feature_table[opd_ext_feat_index].handlers->ext_sfile->sync != NULL)
    171 		ext_feature_table[opd_ext_feat_index].handlers->ext_sfile->sync(sf);
    172 }
    173 
    174 
    175 odb_t * opd_ext_sfile_get(struct transient const * trans, int is_cg)
    176 {
    177 	/* Get ext sfile only if extended feature is enable*/
    178 	if (is_ext_sfile_enabled()
    179 	&& ext_feature_table[opd_ext_feat_index].handlers->ext_sfile->get != NULL)
    180 		return	ext_feature_table[opd_ext_feat_index].handlers->ext_sfile->get(trans, is_cg);
    181 
    182 	return NULL;
    183 }
    184 
    185 
    186 struct opd_event * opd_ext_find_counter_event(unsigned long counter)
    187 {
    188 	/* Only if extended feature is enable*/
    189 	if (is_ext_sfile_enabled()
    190 	&& ext_feature_table[opd_ext_feat_index].handlers->ext_sfile->find_counter_event != NULL)
    191 		return	ext_feature_table[opd_ext_feat_index].handlers->ext_sfile->find_counter_event(counter);
    192 
    193 	return NULL;
    194 }
    195 
    196