| #include <linux/perf_event.h> | |
| #include <perf/evlist.h> | |
| #include <perf/evsel.h> | |
| #include <perf/cpumap.h> | |
| #include <perf/threadmap.h> | |
| #include <perf/mmap.h> | |
| #include <perf/core.h> | |
| #include <perf/event.h> | |
| #include <stdio.h> | |
| #include <unistd.h> | |
| static int libperf_print(enum libperf_print_level level, | |
| const char *fmt, va_list ap) | |
| { | |
| return vfprintf(stderr, fmt, ap); | |
| } | |
| int main(int argc, char **argv) | |
| { | |
| int count = 100000, err = 0; | |
| struct perf_evlist *evlist; | |
| struct perf_evsel *evsel; | |
| struct perf_thread_map *threads; | |
| struct perf_counts_values counts; | |
| struct perf_event_attr attr1 = { | |
| .type = PERF_TYPE_SOFTWARE, | |
| .config = PERF_COUNT_SW_CPU_CLOCK, | |
| .read_format = PERF_FORMAT_TOTAL_TIME_ENABLED|PERF_FORMAT_TOTAL_TIME_RUNNING, | |
| .disabled = 1, | |
| }; | |
| struct perf_event_attr attr2 = { | |
| .type = PERF_TYPE_SOFTWARE, | |
| .config = PERF_COUNT_SW_TASK_CLOCK, | |
| .read_format = PERF_FORMAT_TOTAL_TIME_ENABLED|PERF_FORMAT_TOTAL_TIME_RUNNING, | |
| .disabled = 1, | |
| }; | |
| libperf_init(libperf_print); | |
| threads = perf_thread_map__new_dummy(); | |
| if (!threads) { | |
| fprintf(stderr, "failed to create threads\n"); | |
| return -1; | |
| } | |
| perf_thread_map__set_pid(threads, 0, 0); | |
| evlist = perf_evlist__new(); | |
| if (!evlist) { | |
| fprintf(stderr, "failed to create evlist\n"); | |
| goto out_threads; | |
| } | |
| evsel = perf_evsel__new(&attr1); | |
| if (!evsel) { | |
| fprintf(stderr, "failed to create evsel1\n"); | |
| goto out_evlist; | |
| } | |
| perf_evlist__add(evlist, evsel); | |
| evsel = perf_evsel__new(&attr2); | |
| if (!evsel) { | |
| fprintf(stderr, "failed to create evsel2\n"); | |
| goto out_evlist; | |
| } | |
| perf_evlist__add(evlist, evsel); | |
| perf_evlist__set_maps(evlist, NULL, threads); | |
| err = perf_evlist__open(evlist); | |
| if (err) { | |
| fprintf(stderr, "failed to open evsel\n"); | |
| goto out_evlist; | |
| } | |
| perf_evlist__enable(evlist); | |
| while (count--); | |
| perf_evlist__disable(evlist); | |
| perf_evlist__for_each_evsel(evlist, evsel) { | |
| perf_evsel__read(evsel, 0, 0, &counts); | |
| fprintf(stdout, "count %llu, enabled %llu, run %llu\n", | |
| counts.val, counts.ena, counts.run); | |
| } | |
| perf_evlist__close(evlist); | |
| out_evlist: | |
| perf_evlist__delete(evlist); | |
| out_threads: | |
| perf_thread_map__put(threads); | |
| return err; | |
| } |