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