Commit 987b8238 authored by Alexey Budankov's avatar Alexey Budankov Committed by Arnaldo Carvalho de Melo
Browse files

perf stat: Factor out event handling loop into dispatch_events()



Consolidate event dispatching loops for fork, attach and system wide
monitoring use cases into common dispatch_events() function.

Signed-off-by: default avatarAlexey Budankov <alexey.budankov@linux.intel.com>
Acked-by: default avatarJiri Olsa <jolsa@redhat.com>
Acked-by: default avatarNamhyung Kim <namhyung@kernel.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lore.kernel.org/lkml/8a900bd5-200a-9b0f-7154-80a2343bfd1a@linux.intel.com


Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent b0ce0c8d
Loading
Loading
Loading
Loading
+24 −12
Original line number Diff line number Diff line
@@ -550,6 +550,27 @@ static bool is_target_alive(struct target *_target,
	return false;
}

static int dispatch_events(bool forks, int timeout, int interval, int *times, struct timespec *ts)
{
	int child_exited = 0, status = 0;

	while (!done) {
		if (forks)
			child_exited = waitpid(child_pid, &status, WNOHANG);
		else
			child_exited = !is_target_alive(&target, evsel_list->core.threads) ? 1 : 0;

		if (child_exited)
			break;

		nanosleep(ts, NULL);
		if (timeout || handle_interval(interval, times))
			break;
	}

	return status;
}

enum counter_recovery {
	COUNTER_SKIP,
	COUNTER_RETRY,
@@ -789,13 +810,8 @@ static int __run_perf_stat(int argc, const char **argv, int run_idx)
		perf_evlist__start_workload(evsel_list);
		enable_counters();

		if (interval || timeout) {
			while (!waitpid(child_pid, &status, WNOHANG)) {
				nanosleep(&ts, NULL);
				if (timeout || handle_interval(interval, &times))
					break;
			}
		}
		if (interval || timeout)
			status = dispatch_events(forks, timeout, interval, &times, &ts);
		if (child_pid != -1) {
			if (timeout)
				kill(child_pid, SIGTERM);
@@ -812,11 +828,7 @@ static int __run_perf_stat(int argc, const char **argv, int run_idx)
			psignal(WTERMSIG(status), argv[0]);
	} else {
		enable_counters();
		while (!done && is_target_alive(&target, evsel_list->core.threads)) {
			nanosleep(&ts, NULL);
			if (timeout || handle_interval(interval, &times))
				break;
		}
		status = dispatch_events(forks, timeout, interval, &times, &ts);
	}

	disable_counters();