162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci// Copyright (C) 2019, Red Hat Inc, Arnaldo Carvalho de Melo <acme@redhat.com>
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci#include "evswitch.h"
562306a36Sopenharmony_ci#include "evlist.h"
662306a36Sopenharmony_ci
762306a36Sopenharmony_cibool evswitch__discard(struct evswitch *evswitch, struct evsel *evsel)
862306a36Sopenharmony_ci{
962306a36Sopenharmony_ci	if (evswitch->on && evswitch->discarding) {
1062306a36Sopenharmony_ci		if (evswitch->on != evsel)
1162306a36Sopenharmony_ci			return true;
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci		evswitch->discarding = false;
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci		if (!evswitch->show_on_off_events)
1662306a36Sopenharmony_ci			return true;
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci		return false;
1962306a36Sopenharmony_ci	}
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci	if (evswitch->off && !evswitch->discarding) {
2262306a36Sopenharmony_ci		if (evswitch->off != evsel)
2362306a36Sopenharmony_ci			return false;
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci		evswitch->discarding = true;
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci		if (!evswitch->show_on_off_events)
2862306a36Sopenharmony_ci			return true;
2962306a36Sopenharmony_ci	}
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci	return false;
3262306a36Sopenharmony_ci}
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_cistatic int evswitch__fprintf_enoent(FILE *fp, const char *evtype, const char *evname)
3562306a36Sopenharmony_ci{
3662306a36Sopenharmony_ci	int printed = fprintf(fp, "ERROR: switch-%s event not found (%s)\n", evtype, evname);
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci	return printed += fprintf(fp, "HINT:  use 'perf evlist' to see the available event names\n");
3962306a36Sopenharmony_ci}
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ciint evswitch__init(struct evswitch *evswitch, struct evlist *evlist, FILE *fp)
4262306a36Sopenharmony_ci{
4362306a36Sopenharmony_ci	if (evswitch->on_name) {
4462306a36Sopenharmony_ci		evswitch->on = evlist__find_evsel_by_str(evlist, evswitch->on_name);
4562306a36Sopenharmony_ci		if (evswitch->on == NULL) {
4662306a36Sopenharmony_ci			evswitch__fprintf_enoent(fp, "on", evswitch->on_name);
4762306a36Sopenharmony_ci			return -ENOENT;
4862306a36Sopenharmony_ci		}
4962306a36Sopenharmony_ci		evswitch->discarding = true;
5062306a36Sopenharmony_ci	}
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci	if (evswitch->off_name) {
5362306a36Sopenharmony_ci		evswitch->off = evlist__find_evsel_by_str(evlist, evswitch->off_name);
5462306a36Sopenharmony_ci		if (evswitch->off == NULL) {
5562306a36Sopenharmony_ci			evswitch__fprintf_enoent(fp, "off", evswitch->off_name);
5662306a36Sopenharmony_ci			return -ENOENT;
5762306a36Sopenharmony_ci		}
5862306a36Sopenharmony_ci	}
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ci	return 0;
6162306a36Sopenharmony_ci}
62