Commit fa1b41a7 authored by John Garry's avatar John Garry Committed by Arnaldo Carvalho de Melo
Browse files

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: default avatarJohn Garry <john.garry@huawei.com>
Reviewed-By: default avatarKajol <Jain&lt;kjain@linux.ibm.com>
Link: https://lore.kernel.org/r/1603364547-197086-2-git-send-email-john.garry@huawei.com


Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent c5e6bc23
Loading
Loading
Loading
Loading
+35 −48
Original line number Diff line number Diff line
@@ -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;
	}

	free_arch_std_events();
	free(mapfile);
	return 0;

	goto out_free_mapfile;

empty_map:
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();
out_free_mapfile:
	free(mapfile);
	return ret;
}