evswitch.c (1466B)
1// SPDX-License-Identifier: GPL-2.0-only 2// Copyright (C) 2019, Red Hat Inc, Arnaldo Carvalho de Melo <acme@redhat.com> 3 4#include "evswitch.h" 5#include "evlist.h" 6 7bool evswitch__discard(struct evswitch *evswitch, struct evsel *evsel) 8{ 9 if (evswitch->on && evswitch->discarding) { 10 if (evswitch->on != evsel) 11 return true; 12 13 evswitch->discarding = false; 14 15 if (!evswitch->show_on_off_events) 16 return true; 17 18 return false; 19 } 20 21 if (evswitch->off && !evswitch->discarding) { 22 if (evswitch->off != evsel) 23 return false; 24 25 evswitch->discarding = true; 26 27 if (!evswitch->show_on_off_events) 28 return true; 29 } 30 31 return false; 32} 33 34static int evswitch__fprintf_enoent(FILE *fp, const char *evtype, const char *evname) 35{ 36 int printed = fprintf(fp, "ERROR: switch-%s event not found (%s)\n", evtype, evname); 37 38 return printed += fprintf(fp, "HINT: use 'perf evlist' to see the available event names\n"); 39} 40 41int evswitch__init(struct evswitch *evswitch, struct evlist *evlist, FILE *fp) 42{ 43 if (evswitch->on_name) { 44 evswitch->on = evlist__find_evsel_by_str(evlist, evswitch->on_name); 45 if (evswitch->on == NULL) { 46 evswitch__fprintf_enoent(fp, "on", evswitch->on_name); 47 return -ENOENT; 48 } 49 evswitch->discarding = true; 50 } 51 52 if (evswitch->off_name) { 53 evswitch->off = evlist__find_evsel_by_str(evlist, evswitch->off_name); 54 if (evswitch->off == NULL) { 55 evswitch__fprintf_enoent(fp, "off", evswitch->off_name); 56 return -ENOENT; 57 } 58 } 59 60 return 0; 61}