Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 338920
b: refs/heads/master
c: 49e639e
h: refs/heads/master
v: v3
  • Loading branch information
Feng Tang authored and Arnaldo Carvalho de Melo committed Oct 29, 2012
1 parent a58e420 commit 9d28d37
Show file tree
Hide file tree
Showing 2 changed files with 80 additions and 4 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 70cb4e963f77dae90ae2aa3dd9385a43737c469f
refs/heads/master: 49e639e256ea18fb92f609dd6be09883cd9d05aa
82 changes: 79 additions & 3 deletions trunk/tools/perf/builtin-script.c
Original file line number Diff line number Diff line change
Expand Up @@ -1029,6 +1029,68 @@ static int list_available_scripts(const struct option *opt __maybe_unused,
exit(0);
}

/*
* Some scripts specify the required events in their "xxx-record" file,
* this function will check if the events in perf.data match those
* mentioned in the "xxx-record".
*
* Fixme: All existing "xxx-record" are all in good formats "-e event ",
* which is covered well now. And new parsing code should be added to
* cover the future complexing formats like event groups etc.
*/
static int check_ev_match(char *dir_name, char *scriptname,
struct perf_session *session)
{
char filename[MAXPATHLEN], evname[128];
char line[BUFSIZ], *p;
struct perf_evsel *pos;
int match, len;
FILE *fp;

sprintf(filename, "%s/bin/%s-record", dir_name, scriptname);

fp = fopen(filename, "r");
if (!fp)
return -1;

while (fgets(line, sizeof(line), fp)) {
p = ltrim(line);
if (*p == '#')
continue;

while (strlen(p)) {
p = strstr(p, "-e");
if (!p)
break;

p += 2;
p = ltrim(p);
len = strcspn(p, " \t");
if (!len)
break;

snprintf(evname, len + 1, "%s", p);

match = 0;
list_for_each_entry(pos,
&session->evlist->entries, node) {
if (!strcmp(perf_evsel__name(pos), evname)) {
match = 1;
break;
}
}

if (!match) {
fclose(fp);
return -1;
}
}
}

fclose(fp);
return 0;
}

/*
* Return -1 if none is found, otherwise the actual scripts number.
*
Expand All @@ -1039,17 +1101,23 @@ static int list_available_scripts(const struct option *opt __maybe_unused,
int find_scripts(char **scripts_array, char **scripts_path_array)
{
struct dirent *script_next, *lang_next, script_dirent, lang_dirent;
char scripts_path[MAXPATHLEN];
char scripts_path[MAXPATHLEN], lang_path[MAXPATHLEN];
DIR *scripts_dir, *lang_dir;
char lang_path[MAXPATHLEN];
struct perf_session *session;
char *temp;
int i = 0;

session = perf_session__new(input_name, O_RDONLY, 0, false, NULL);
if (!session)
return -1;

snprintf(scripts_path, MAXPATHLEN, "%s/scripts", perf_exec_path());

scripts_dir = opendir(scripts_path);
if (!scripts_dir)
if (!scripts_dir) {
perf_session__delete(session);
return -1;
}

for_each_lang(scripts_path, scripts_dir, lang_dirent, lang_next) {
snprintf(lang_path, MAXPATHLEN, "%s/%s", scripts_path,
Expand Down Expand Up @@ -1077,10 +1145,18 @@ int find_scripts(char **scripts_array, char **scripts_path_array)
snprintf(scripts_array[i],
(temp - script_dirent.d_name) + 1,
"%s", script_dirent.d_name);

if (check_ev_match(lang_path,
scripts_array[i], session))
continue;

i++;
}
closedir(lang_dir);
}

closedir(scripts_dir);
perf_session__delete(session);
return i;
}

Expand Down

0 comments on commit 9d28d37

Please sign in to comment.