Commit f542e767 authored by Jiri Olsa's avatar Jiri Olsa Committed by Arnaldo Carvalho de Melo

perf hists: Introduce hist_entry_ops

Introducing allocation callbacks, that allows to extend current
hist_entry object into objects with special needs without polluting the
current hist_entry object.
Signed-off-by: default avatarJiri Olsa <jolsa@kernel.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1467701765-26194-3-git-send-email-jolsa@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 0a269a6b
...@@ -424,21 +424,42 @@ static int hist_entry__init(struct hist_entry *he, ...@@ -424,21 +424,42 @@ static int hist_entry__init(struct hist_entry *he,
return 0; return 0;
} }
static void *hist_entry__zalloc(size_t size)
{
return zalloc(size + sizeof(struct hist_entry));
}
static void hist_entry__free(void *ptr)
{
free(ptr);
}
static struct hist_entry_ops default_ops = {
.new = hist_entry__zalloc,
.free = hist_entry__free,
};
static struct hist_entry *hist_entry__new(struct hist_entry *template, static struct hist_entry *hist_entry__new(struct hist_entry *template,
bool sample_self) bool sample_self)
{ {
struct hist_entry_ops *ops = template->ops;
size_t callchain_size = 0; size_t callchain_size = 0;
struct hist_entry *he; struct hist_entry *he;
int err = 0; int err = 0;
if (!ops)
ops = template->ops = &default_ops;
if (symbol_conf.use_callchain) if (symbol_conf.use_callchain)
callchain_size = sizeof(struct callchain_root); callchain_size = sizeof(struct callchain_root);
he = zalloc(sizeof(*he) + callchain_size); he = ops->new(callchain_size);
if (he) { if (he) {
err = hist_entry__init(he, template, sample_self); err = hist_entry__init(he, template, sample_self);
if (err) if (err) {
zfree(&he); ops->free(he);
he = NULL;
}
} }
return he; return he;
...@@ -1050,6 +1071,8 @@ hist_entry__collapse(struct hist_entry *left, struct hist_entry *right) ...@@ -1050,6 +1071,8 @@ hist_entry__collapse(struct hist_entry *left, struct hist_entry *right)
void hist_entry__delete(struct hist_entry *he) void hist_entry__delete(struct hist_entry *he)
{ {
struct hist_entry_ops *ops = he->ops;
thread__zput(he->thread); thread__zput(he->thread);
map__zput(he->ms.map); map__zput(he->ms.map);
...@@ -1074,7 +1097,7 @@ void hist_entry__delete(struct hist_entry *he) ...@@ -1074,7 +1097,7 @@ void hist_entry__delete(struct hist_entry *he)
free_callchain(he->callchain); free_callchain(he->callchain);
free(he->trace_output); free(he->trace_output);
free(he->raw_data); free(he->raw_data);
free(he); ops->free(he);
} }
/* /*
......
...@@ -67,6 +67,11 @@ struct hist_entry_diff { ...@@ -67,6 +67,11 @@ struct hist_entry_diff {
}; };
}; };
struct hist_entry_ops {
void *(*new)(size_t size);
void (*free)(void *ptr);
};
/** /**
* struct hist_entry - histogram entry * struct hist_entry - histogram entry
* *
...@@ -125,6 +130,7 @@ struct hist_entry { ...@@ -125,6 +130,7 @@ struct hist_entry {
void *trace_output; void *trace_output;
struct perf_hpp_list *hpp_list; struct perf_hpp_list *hpp_list;
struct hist_entry *parent_he; struct hist_entry *parent_he;
struct hist_entry_ops *ops;
union { union {
/* this is for hierarchical entry structure */ /* this is for hierarchical entry structure */
struct { struct {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment