• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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@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 
get_index_for_feature(char const * name)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 
is_ext_enabled()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 
is_ext_sfile_enabled()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  */
opd_ext_initialize(char const * value)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 
opd_ext_deinitialize()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 
opd_ext_print_stats()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  */
opd_ext_sfile_create(struct sfile * sf)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 
opd_ext_sfile_dup(struct sfile * to,struct sfile * from)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 
opd_ext_sfile_close(struct sfile * sf)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 
opd_ext_sfile_sync(struct sfile * sf)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 
opd_ext_sfile_get(struct transient const * trans,int is_cg)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 
opd_ext_find_counter_event(unsigned long counter)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