|
@@ -32,6 +32,48 @@ static struct {
|
|
|
bool cloexec;
|
|
|
} perf_missing_features;
|
|
|
|
|
|
+static int perf_evsel__no_extra_init(struct perf_evsel *evsel __maybe_unused)
|
|
|
+{
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static void perf_evsel__no_extra_fini(struct perf_evsel *evsel __maybe_unused)
|
|
|
+{
|
|
|
+}
|
|
|
+
|
|
|
+static struct {
|
|
|
+ size_t size;
|
|
|
+ int (*init)(struct perf_evsel *evsel);
|
|
|
+ void (*fini)(struct perf_evsel *evsel);
|
|
|
+} perf_evsel__object = {
|
|
|
+ .size = sizeof(struct perf_evsel),
|
|
|
+ .init = perf_evsel__no_extra_init,
|
|
|
+ .fini = perf_evsel__no_extra_fini,
|
|
|
+};
|
|
|
+
|
|
|
+int perf_evsel__object_config(size_t object_size,
|
|
|
+ int (*init)(struct perf_evsel *evsel),
|
|
|
+ void (*fini)(struct perf_evsel *evsel))
|
|
|
+{
|
|
|
+
|
|
|
+ if (object_size == 0)
|
|
|
+ goto set_methods;
|
|
|
+
|
|
|
+ if (perf_evsel__object.size > object_size)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ perf_evsel__object.size = object_size;
|
|
|
+
|
|
|
+set_methods:
|
|
|
+ if (init != NULL)
|
|
|
+ perf_evsel__object.init = init;
|
|
|
+
|
|
|
+ if (fini != NULL)
|
|
|
+ perf_evsel__object.fini = fini;
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
#define FD(e, x, y) (*(int *)xyarray__entry(e->fd, x, y))
|
|
|
|
|
|
int __perf_evsel__sample_size(u64 sample_type)
|
|
@@ -169,13 +211,14 @@ void perf_evsel__init(struct perf_evsel *evsel,
|
|
|
evsel->scale = 1.0;
|
|
|
INIT_LIST_HEAD(&evsel->node);
|
|
|
hists__init(&evsel->hists);
|
|
|
+ perf_evsel__object.init(evsel);
|
|
|
evsel->sample_size = __perf_evsel__sample_size(attr->sample_type);
|
|
|
perf_evsel__calc_id_pos(evsel);
|
|
|
}
|
|
|
|
|
|
struct perf_evsel *perf_evsel__new_idx(struct perf_event_attr *attr, int idx)
|
|
|
{
|
|
|
- struct perf_evsel *evsel = zalloc(sizeof(*evsel));
|
|
|
+ struct perf_evsel *evsel = zalloc(perf_evsel__object.size);
|
|
|
|
|
|
if (evsel != NULL)
|
|
|
perf_evsel__init(evsel, attr, idx);
|
|
@@ -185,7 +228,7 @@ struct perf_evsel *perf_evsel__new_idx(struct perf_event_attr *attr, int idx)
|
|
|
|
|
|
struct perf_evsel *perf_evsel__newtp_idx(const char *sys, const char *name, int idx)
|
|
|
{
|
|
|
- struct perf_evsel *evsel = zalloc(sizeof(*evsel));
|
|
|
+ struct perf_evsel *evsel = zalloc(perf_evsel__object.size);
|
|
|
|
|
|
if (evsel != NULL) {
|
|
|
struct perf_event_attr attr = {
|
|
@@ -817,6 +860,7 @@ void perf_evsel__exit(struct perf_evsel *evsel)
|
|
|
assert(list_empty(&evsel->node));
|
|
|
perf_evsel__free_fd(evsel);
|
|
|
perf_evsel__free_id(evsel);
|
|
|
+ perf_evsel__object.fini(evsel);
|
|
|
}
|
|
|
|
|
|
void perf_evsel__delete(struct perf_evsel *evsel)
|