perf jevents: Tidy error handling

There is much duplication in the error handling for directory transvering
for prcessing JSONs.

Factor out the common code to tidy a bit.

Signed-off-by: John Garry <john.garry@huawei.com>
Reviewed-By: Kajol Jain<kjain@linux.ibm.com>
Link: https://lore.kernel.org/r/1603364547-197086-2-git-send-email-john.garry@huawei.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
John Garry 2020-10-22 19:02:26 +08:00 committed by Arnaldo Carvalho de Melo
parent c5e6bc2335
commit fa1b41a74d
1 changed files with 37 additions and 50 deletions

View File

@ -1100,12 +1100,13 @@ static int process_one_file(const char *fpath, const struct stat *sb,
*/
int main(int argc, char *argv[])
{
int rc, ret = 0;
int rc, ret = 0, empty_map = 0;
int maxfds;
char ldirname[PATH_MAX];
const char *arch;
const char *output_file;
const char *start_dirname;
char *err_string_ext = "";
struct stat stbuf;
prog = basename(argv[0]);
@ -1133,7 +1134,8 @@ int main(int argc, char *argv[])
/* If architecture does not have any event lists, bail out */
if (stat(ldirname, &stbuf) < 0) {
pr_info("%s: Arch %s has no PMU event lists\n", prog, arch);
goto empty_map;
empty_map = 1;
goto err_close_eventsfp;
}
/* Include pmu-events.h first */
@ -1150,75 +1152,60 @@ int main(int argc, char *argv[])
*/
maxfds = get_maxfds();
mapfile = NULL;
rc = nftw(ldirname, preprocess_arch_std_files, maxfds, 0);
if (rc && verbose) {
pr_info("%s: Error preprocessing arch standard files %s\n",
prog, ldirname);
goto empty_map;
} else if (rc < 0) {
/* Make build fail */
fclose(eventsfp);
free_arch_std_events();
return 1;
} else if (rc) {
goto empty_map;
}
if (rc)
goto err_processing_std_arch_event_dir;
rc = nftw(ldirname, process_one_file, maxfds, 0);
if (rc && verbose) {
pr_info("%s: Error walking file tree %s\n", prog, ldirname);
goto empty_map;
} else if (rc < 0) {
/* Make build fail */
fclose(eventsfp);
free_arch_std_events();
ret = 1;
goto out_free_mapfile;
} else if (rc) {
goto empty_map;
}
if (rc)
goto err_processing_dir;
sprintf(ldirname, "%s/test", start_dirname);
rc = nftw(ldirname, process_one_file, maxfds, 0);
if (rc && verbose) {
pr_info("%s: Error walking file tree %s rc=%d for test\n",
prog, ldirname, rc);
goto empty_map;
} else if (rc < 0) {
/* Make build fail */
free_arch_std_events();
ret = 1;
goto out_free_mapfile;
} else if (rc) {
goto empty_map;
}
if (rc)
goto err_processing_dir;
if (close_table)
print_events_table_suffix(eventsfp);
if (!mapfile) {
pr_info("%s: No CPU->JSON mapping?\n", prog);
goto empty_map;
empty_map = 1;
goto err_close_eventsfp;
}
if (process_mapfile(eventsfp, mapfile)) {
rc = process_mapfile(eventsfp, mapfile);
fclose(eventsfp);
if (rc) {
pr_info("%s: Error processing mapfile %s\n", prog, mapfile);
/* Make build fail */
fclose(eventsfp);
free_arch_std_events();
ret = 1;
goto err_out;
}
goto out_free_mapfile;
empty_map:
fclose(eventsfp);
create_empty_mapping(output_file);
free_arch_std_events();
out_free_mapfile:
free(mapfile);
return 0;
err_processing_std_arch_event_dir:
err_string_ext = " for std arch event";
err_processing_dir:
if (verbose) {
pr_info("%s: Error walking file tree %s%s\n", prog, ldirname,
err_string_ext);
empty_map = 1;
} else if (rc < 0) {
ret = 1;
} else {
empty_map = 1;
}
err_close_eventsfp:
fclose(eventsfp);
if (empty_map)
create_empty_mapping(output_file);
err_out:
free_arch_std_events();
free(mapfile);
return ret;
}