6 #include <linux/bitops.h>
7 #include <linux/hash.h>
9 struct perf_evlist
*perf_evlist__new(void)
11 struct perf_evlist
*evlist
= zalloc(sizeof(*evlist
));
16 for (i
= 0; i
< PERF_EVLIST__HLIST_SIZE
; ++i
)
17 INIT_HLIST_HEAD(&evlist
->heads
[i
]);
18 INIT_LIST_HEAD(&evlist
->entries
);
24 static void perf_evlist__purge(struct perf_evlist
*evlist
)
26 struct perf_evsel
*pos
, *n
;
28 list_for_each_entry_safe(pos
, n
, &evlist
->entries
, node
) {
29 list_del_init(&pos
->node
);
30 perf_evsel__delete(pos
);
33 evlist
->nr_entries
= 0;
36 void perf_evlist__delete(struct perf_evlist
*evlist
)
38 perf_evlist__purge(evlist
);
44 void perf_evlist__add(struct perf_evlist
*evlist
, struct perf_evsel
*entry
)
46 list_add_tail(&entry
->node
, &evlist
->entries
);
50 int perf_evlist__add_default(struct perf_evlist
*evlist
)
52 struct perf_event_attr attr
= {
53 .type
= PERF_TYPE_HARDWARE
,
54 .config
= PERF_COUNT_HW_CPU_CYCLES
,
56 struct perf_evsel
*evsel
= perf_evsel__new(&attr
, 0);
61 perf_evlist__add(evlist
, evsel
);
65 int perf_evlist__alloc_pollfd(struct perf_evlist
*evlist
, int ncpus
, int nthreads
)
67 int nfds
= ncpus
* nthreads
* evlist
->nr_entries
;
68 evlist
->pollfd
= malloc(sizeof(struct pollfd
) * nfds
);
69 return evlist
->pollfd
!= NULL
? 0 : -ENOMEM
;
72 void perf_evlist__add_pollfd(struct perf_evlist
*evlist
, int fd
)
74 fcntl(fd
, F_SETFL
, O_NONBLOCK
);
75 evlist
->pollfd
[evlist
->nr_fds
].fd
= fd
;
76 evlist
->pollfd
[evlist
->nr_fds
].events
= POLLIN
;
80 struct perf_evsel
*perf_evlist__id2evsel(struct perf_evlist
*evlist
, u64 id
)
82 struct hlist_head
*head
;
83 struct hlist_node
*pos
;
84 struct perf_sample_id
*sid
;
87 if (evlist
->nr_entries
== 1)
88 return list_entry(evlist
->entries
.next
, struct perf_evsel
, node
);
90 hash
= hash_64(id
, PERF_EVLIST__HLIST_BITS
);
91 head
= &evlist
->heads
[hash
];
93 hlist_for_each_entry(sid
, pos
, head
, node
)