evlist.c 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. #include <poll.h>
  2. #include "evlist.h"
  3. #include "evsel.h"
  4. #include "util.h"
  5. struct perf_evlist *perf_evlist__new(void)
  6. {
  7. struct perf_evlist *evlist = zalloc(sizeof(*evlist));
  8. if (evlist != NULL) {
  9. INIT_LIST_HEAD(&evlist->entries);
  10. }
  11. return evlist;
  12. }
  13. static void perf_evlist__purge(struct perf_evlist *evlist)
  14. {
  15. struct perf_evsel *pos, *n;
  16. list_for_each_entry_safe(pos, n, &evlist->entries, node) {
  17. list_del_init(&pos->node);
  18. perf_evsel__delete(pos);
  19. }
  20. evlist->nr_entries = 0;
  21. }
  22. void perf_evlist__delete(struct perf_evlist *evlist)
  23. {
  24. perf_evlist__purge(evlist);
  25. free(evlist->pollfd);
  26. free(evlist);
  27. }
  28. void perf_evlist__add(struct perf_evlist *evlist, struct perf_evsel *entry)
  29. {
  30. list_add_tail(&entry->node, &evlist->entries);
  31. ++evlist->nr_entries;
  32. }
  33. int perf_evlist__add_default(struct perf_evlist *evlist)
  34. {
  35. struct perf_event_attr attr = {
  36. .type = PERF_TYPE_HARDWARE,
  37. .config = PERF_COUNT_HW_CPU_CYCLES,
  38. };
  39. struct perf_evsel *evsel = perf_evsel__new(&attr, 0);
  40. if (evsel == NULL)
  41. return -ENOMEM;
  42. perf_evlist__add(evlist, evsel);
  43. return 0;
  44. }
  45. int perf_evlist__alloc_pollfd(struct perf_evlist *evlist, int ncpus, int nthreads)
  46. {
  47. int nfds = ncpus * nthreads * evlist->nr_entries;
  48. evlist->pollfd = malloc(sizeof(struct pollfd) * nfds);
  49. return evlist->pollfd != NULL ? 0 : -ENOMEM;
  50. }