18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
28c2ecf20Sopenharmony_ci// Copyright (C) 2019, Red Hat Inc, Arnaldo Carvalho de Melo <acme@redhat.com>
38c2ecf20Sopenharmony_ci
48c2ecf20Sopenharmony_ci#include "evswitch.h"
58c2ecf20Sopenharmony_ci#include "evlist.h"
68c2ecf20Sopenharmony_ci
78c2ecf20Sopenharmony_cibool evswitch__discard(struct evswitch *evswitch, struct evsel *evsel)
88c2ecf20Sopenharmony_ci{
98c2ecf20Sopenharmony_ci	if (evswitch->on && evswitch->discarding) {
108c2ecf20Sopenharmony_ci		if (evswitch->on != evsel)
118c2ecf20Sopenharmony_ci			return true;
128c2ecf20Sopenharmony_ci
138c2ecf20Sopenharmony_ci		evswitch->discarding = false;
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_ci		if (!evswitch->show_on_off_events)
168c2ecf20Sopenharmony_ci			return true;
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_ci		return false;
198c2ecf20Sopenharmony_ci	}
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_ci	if (evswitch->off && !evswitch->discarding) {
228c2ecf20Sopenharmony_ci		if (evswitch->off != evsel)
238c2ecf20Sopenharmony_ci			return false;
248c2ecf20Sopenharmony_ci
258c2ecf20Sopenharmony_ci		evswitch->discarding = true;
268c2ecf20Sopenharmony_ci
278c2ecf20Sopenharmony_ci		if (!evswitch->show_on_off_events)
288c2ecf20Sopenharmony_ci			return true;
298c2ecf20Sopenharmony_ci	}
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_ci	return false;
328c2ecf20Sopenharmony_ci}
338c2ecf20Sopenharmony_ci
348c2ecf20Sopenharmony_cistatic int evswitch__fprintf_enoent(FILE *fp, const char *evtype, const char *evname)
358c2ecf20Sopenharmony_ci{
368c2ecf20Sopenharmony_ci	int printed = fprintf(fp, "ERROR: switch-%s event not found (%s)\n", evtype, evname);
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_ci	return printed += fprintf(fp, "HINT:  use 'perf evlist' to see the available event names\n");
398c2ecf20Sopenharmony_ci}
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_ciint evswitch__init(struct evswitch *evswitch, struct evlist *evlist, FILE *fp)
428c2ecf20Sopenharmony_ci{
438c2ecf20Sopenharmony_ci	if (evswitch->on_name) {
448c2ecf20Sopenharmony_ci		evswitch->on = perf_evlist__find_evsel_by_str(evlist, evswitch->on_name);
458c2ecf20Sopenharmony_ci		if (evswitch->on == NULL) {
468c2ecf20Sopenharmony_ci			evswitch__fprintf_enoent(fp, "on", evswitch->on_name);
478c2ecf20Sopenharmony_ci			return -ENOENT;
488c2ecf20Sopenharmony_ci		}
498c2ecf20Sopenharmony_ci		evswitch->discarding = true;
508c2ecf20Sopenharmony_ci	}
518c2ecf20Sopenharmony_ci
528c2ecf20Sopenharmony_ci	if (evswitch->off_name) {
538c2ecf20Sopenharmony_ci		evswitch->off = perf_evlist__find_evsel_by_str(evlist, evswitch->off_name);
548c2ecf20Sopenharmony_ci		if (evswitch->off == NULL) {
558c2ecf20Sopenharmony_ci			evswitch__fprintf_enoent(fp, "off", evswitch->off_name);
568c2ecf20Sopenharmony_ci			return -ENOENT;
578c2ecf20Sopenharmony_ci		}
588c2ecf20Sopenharmony_ci	}
598c2ecf20Sopenharmony_ci
608c2ecf20Sopenharmony_ci	return 0;
618c2ecf20Sopenharmony_ci}
62