Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1436535

[PATCH 3/4] perf tools: Introduce hist_entry_ops

From Jiri Olsa <jolsa@kernel.org>
Newsgroups linux.kernel
Subject [PATCH 3/4] perf tools: Introduce hist_entry_ops
Date 2016-07-04 16:10 +0200
Message-ID <rRcJs-6B7-19@gated-at.bofh.it> (permalink)
References <rRcJs-6B7-21@gated-at.bofh.it>
Organization linux.* mail to news gateway

Show all headers | View raw


Introducing allocation callbacks, that allows to extend
current hist_entry object into objects with special needs
without polluting the current hist_entry object.

Link: http://lkml.kernel.org/n/tip-yvapb3gmmn01qo7qn9lzl9vr@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/util/hist.c | 31 +++++++++++++++++++++++++++----
 tools/perf/util/sort.h |  6 ++++++
 2 files changed, 33 insertions(+), 4 deletions(-)

diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c
index 04f3b52a319c..355b7601ddb7 100644
--- a/tools/perf/util/hist.c
+++ b/tools/perf/util/hist.c
@@ -424,21 +424,42 @@ static int hist_entry__init(struct hist_entry *he,
 	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,
 					  bool sample_self)
 {
+	struct hist_entry_ops *ops = template->ops;
 	size_t callchain_size = 0;
 	struct hist_entry *he;
 	int err = 0;
 
+	if (!ops)
+		ops = template->ops = &default_ops;
+
 	if (symbol_conf.use_callchain)
 		callchain_size = sizeof(struct callchain_root);
 
-	he = zalloc(sizeof(*he) + callchain_size);
+	he = ops->new(callchain_size);
 	if (he) {
 		err = hist_entry__init(he, template, sample_self);
-		if (err)
-			zfree(&he);
+		if (err) {
+			ops->free(he);
+			he = NULL;
+		}
 	}
 
 	return he;
@@ -1050,6 +1071,8 @@ hist_entry__collapse(struct hist_entry *left, struct hist_entry *right)
 
 void hist_entry__delete(struct hist_entry *he)
 {
+	struct hist_entry_ops *ops = he->ops;
+
 	thread__zput(he->thread);
 	map__zput(he->ms.map);
 
@@ -1074,7 +1097,7 @@ void hist_entry__delete(struct hist_entry *he)
 	free_callchain(he->callchain);
 	free(he->trace_output);
 	free(he->raw_data);
-	free(he);
+	ops->free(he);
 }
 
 /*
diff --git a/tools/perf/util/sort.h b/tools/perf/util/sort.h
index ebb59cacd092..6fd0801d58a4 100644
--- a/tools/perf/util/sort.h
+++ b/tools/perf/util/sort.h
@@ -67,6 +67,11 @@ struct hist_entry_diff {
 	};
 };
 
+struct hist_entry_ops {
+	void*	(*new)(size_t);
+	void	(*free)(void *);
+};
+
 /**
  * struct hist_entry - histogram entry
  *
@@ -125,6 +130,7 @@ struct hist_entry {
 	void			*trace_output;
 	struct perf_hpp_list	*hpp_list;
 	struct hist_entry	*parent_he;
+	struct hist_entry_ops	*ops;
 	union {
 		/* this is for hierarchical entry structure */
 		struct {
-- 
2.4.11

Back to linux.kernel | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

[RFC 0/4] perf tools: Add hist_entry allocation callbacks Jiri Olsa <jolsa@kernel.org> - 2016-07-04 16:10 +0200
  [PATCH 1/4] perf tools: Introduce hist_entry__init function Jiri Olsa <jolsa@kernel.org> - 2016-07-04 16:10 +0200
    Re: [PATCH 1/4] perf tools: Introduce hist_entry__init function Arnaldo Carvalho de Melo <acme@kernel.org> - 2016-07-04 21:10 +0200
  [PATCH 2/4] perf tools: Do the error path hist_entry release in hist_entry__new Jiri Olsa <jolsa@kernel.org> - 2016-07-04 16:10 +0200
    Re: [PATCH 2/4] perf tools: Do the error path hist_entry release in  hist_entry__new Arnaldo Carvalho de Melo <acme@kernel.org> - 2016-07-04 21:10 +0200
      Re: [PATCH 2/4] perf tools: Do the error path hist_entry release in  hist_entry__new Jiri Olsa <jolsa@redhat.com> - 2016-07-05 08:40 +0200
  [PATCH 3/4] perf tools: Introduce hist_entry_ops Jiri Olsa <jolsa@kernel.org> - 2016-07-04 16:10 +0200
  [PATCH 4/4] perf tools: Introduce hists__add_entry_ops function Jiri Olsa <jolsa@kernel.org> - 2016-07-04 16:10 +0200

csiph-web