perf evsel: Subclassing
tip-bot for Arnaldo Carvalho de Melo
merge botCommit-ID: ce8ccff5dd6b87dfe3495c7e9c5d56169bbacf58 Gitweb: http://git.kernel.org/tip/ce8ccff5dd6b87dfe3495c7e9c5d56169bbacf58 Author: Arnaldo Carvalho de Melo <[email protected]> AuthorDate: Thu, 9 Oct 2014 15:29:51 -0300 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Tue, 14 Oct 2014 17:32:03 -0300
perf evsel: Subclassing
Provide a method to be called at tool start to config the perf_evsel instance size, together with optional constructor and destructor.
This will be used so that perf_evsel doesn't always include a struct hists, tools that works with hists/hist_entries, like report, top and annotate, will, at start, tell the evsel class the size they need per instance.
v2: Don't use exit as a name of a member of function parameter, as this
breaks the build on at least fedora14 and rhel6.
Cc Adrian Hunter <[email protected]>
Cc Borislav Petkov <[email protected]>
Cc David Ahern <[email protected]>
Cc Don Zickus <[email protected]>
Cc Frederic Weisbecker <[email protected]>
Cc Jean Pihet <[email protected]>
Cc Jiri Olsa <[email protected]>
Cc Mike Galbraith <[email protected]>
Cc Namhyung Kim <[email protected]>
Cc Paul Mackerras <[email protected]>
Cc Peter Zijlstra <[email protected]>
Cc Stephane Eranian <[email protected]>
Signed-off-by Arnaldo Carvalho de Melo <[email protected]>
--- tools/perf/util/evsel.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++-- tools/perf/util/evsel.h | 4 ++++ 2 files changed, 50 insertions(+), 2 deletions(-)
tools/perf/util/evsel.c +46 -2
@@ -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)
tools/perf/util/evsel.h +4 -0
@@ -112,6 +112,10 @@ struct thread_map;struct perf_evlist ;struct record_opts ; +int perf_evsel__object_config (size_t object_size, +int (*init)(struct perf_evsel *evsel), +void (*fini)(struct perf_evsel *evsel)); +struct perf_evsel *perf_evsel__new_idx (struct perf_event_attr *attr,int idx);static inline struct perf_evsel *perf_evsel__new (struct perf_event_attr *attr)