All of lore.kernel.org
 help / color / mirror / Atom feed
From: Masami Hiramatsu <mhiramat@kernel.org>
To: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Masami Hiramatsu <mhiramat@kernel.org>,
	linux-kernel@vger.kernel.org, Namhyung Kim <namhyung@kernel.org>,
	Peter Zijlstra <peterz@infradead.org>,
	Ingo Molnar <mingo@redhat.com>,
	Hemant Kumar <hemant@linux.vnet.ibm.com>,
	Ananth N Mavinakayanahalli <ananth@linux.vnet.ibm.com>,
	Brendan Gregg <brendan.d.gregg@gmail.com>
Subject: [PATCH perf/core v11 04/23] perf probe: Add perf_probe_event__copy()
Date: Wed, 15 Jun 2016 12:40:09 +0900	[thread overview]
Message-ID: <20160615034009.2064.86862.stgit@devbox> (raw)
In-Reply-To: <20160615033925.2064.31216.stgit@devbox>

Add perf_probe_event__copy() to copy perf_probe_event
data structure and sub data structures under given source
perf_probe_event.

Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
---
 Changes in v10:
  - Splited from "Add --cache option to cache the probe definitions"
---
 tools/perf/util/probe-event.c |   76 +++++++++++++++++++++++++++++++++++++++--
 tools/perf/util/probe-event.h |    3 ++
 2 files changed, 76 insertions(+), 3 deletions(-)

diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
index 7ae3dd1..84f4b2b3 100644
--- a/tools/perf/util/probe-event.c
+++ b/tools/perf/util/probe-event.c
@@ -2030,6 +2030,79 @@ void clear_perf_probe_event(struct perf_probe_event *pev)
 	memset(pev, 0, sizeof(*pev));
 }
 
+#define strdup_or_goto(str, label)	\
+({ char *__p = NULL; if (str && !(__p = strdup(str))) goto label; __p; })
+
+static int perf_probe_point__copy(struct perf_probe_point *dst,
+				  struct perf_probe_point *src)
+{
+	dst->file = strdup_or_goto(src->file, out_err);
+	dst->function = strdup_or_goto(src->function, out_err);
+	dst->lazy_line = strdup_or_goto(src->lazy_line, out_err);
+	dst->line = src->line;
+	dst->retprobe = src->retprobe;
+	dst->offset = src->offset;
+	return 0;
+
+out_err:
+	clear_perf_probe_point(dst);
+	return -ENOMEM;
+}
+
+static int perf_probe_arg__copy(struct perf_probe_arg *dst,
+				struct perf_probe_arg *src)
+{
+	struct perf_probe_arg_field *field, **ppfield;
+
+	dst->name = strdup_or_goto(src->name, out_err);
+	dst->var = strdup_or_goto(src->var, out_err);
+	dst->type = strdup_or_goto(src->type, out_err);
+
+	field = src->field;
+	ppfield = &(dst->field);
+	while (field) {
+		*ppfield = zalloc(sizeof(*field));
+		if (!*ppfield)
+			goto out_err;
+		(*ppfield)->name = strdup_or_goto(field->name, out_err);
+		(*ppfield)->index = field->index;
+		(*ppfield)->ref = field->ref;
+		field = field->next;
+		ppfield = &((*ppfield)->next);
+	}
+	return 0;
+out_err:
+	return -ENOMEM;
+}
+
+int perf_probe_event__copy(struct perf_probe_event *dst,
+			   struct perf_probe_event *src)
+{
+	int i;
+
+	dst->event = strdup_or_goto(src->event, out_err);
+	dst->group = strdup_or_goto(src->group, out_err);
+	dst->target = strdup_or_goto(src->target, out_err);
+	dst->uprobes = src->uprobes;
+
+	if (perf_probe_point__copy(&dst->point, &src->point) < 0)
+		goto out_err;
+
+	dst->args = zalloc(sizeof(struct perf_probe_arg) * src->nargs);
+	if (!dst->args)
+		goto out_err;
+	dst->nargs = src->nargs;
+
+	for (i = 0; i < src->nargs; i++)
+		if (perf_probe_arg__copy(&dst->args[i], &src->args[i]) < 0)
+			goto out_err;
+	return 0;
+
+out_err:
+	clear_perf_probe_event(dst);
+	return -ENOMEM;
+}
+
 void clear_probe_trace_event(struct probe_trace_event *tev)
 {
 	struct probe_trace_arg_ref *ref, *next;
@@ -2505,9 +2578,6 @@ static int find_probe_functions(struct map *map, char *name,
 	return found;
 }
 
-#define strdup_or_goto(str, label)	\
-	({ char *__p = strdup(str); if (!__p) goto label; __p; })
-
 void __weak arch__fix_tev_from_maps(struct perf_probe_event *pev __maybe_unused,
 				struct probe_trace_event *tev __maybe_unused,
 				struct map *map __maybe_unused,
diff --git a/tools/perf/util/probe-event.h b/tools/perf/util/probe-event.h
index 5a27eb4..367f886 100644
--- a/tools/perf/util/probe-event.h
+++ b/tools/perf/util/probe-event.h
@@ -122,6 +122,9 @@ char *synthesize_perf_probe_command(struct perf_probe_event *pev);
 char *synthesize_probe_trace_command(struct probe_trace_event *tev);
 char *synthesize_perf_probe_arg(struct perf_probe_arg *pa);
 
+int perf_probe_event__copy(struct perf_probe_event *dst,
+			   struct perf_probe_event *src);
+
 /* Check the perf_probe_event needs debuginfo */
 bool perf_probe_event_need_dwarf(struct perf_probe_event *pev);
 

  parent reply	other threads:[~2016-06-15  3:40 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-06-15  3:39 [PATCH perf/core v11 00/23] perf-probe --cache and SDT support Masami Hiramatsu
2016-06-15  3:39 ` [PATCH perf/core v11 01/23] perf: util: Fix rm_rf() to handle non-regular files correctly Masami Hiramatsu
2016-06-15  3:39 ` [PATCH perf/core v11 02/23] perf-probe: Fix to add NULL check for strndup Masami Hiramatsu
2016-06-15  3:40 ` [PATCH perf/core v11 03/23] perf-buildid: Rename and export build_id_cache__cachedir() Masami Hiramatsu
2016-06-15  3:40 ` Masami Hiramatsu [this message]
2016-06-15  3:40 ` [PATCH perf/core v11 05/23] perf probe: Recover and export synthesize_perf_probe_point() Masami Hiramatsu
2016-06-15  3:40 ` [PATCH perf/core v11 06/23] perf probe-file: Introduce perf_cache interfaces Masami Hiramatsu
2016-06-15  3:40 ` [PATCH perf/core v11 07/23] perf probe: Add --cache option to cache the probe definitions Masami Hiramatsu
2016-06-15  3:40 ` [PATCH perf/core v11 08/23] perf probe: Use cache entry if possible Masami Hiramatsu
2016-06-15  3:41 ` [PATCH perf/core v11 09/23] perf probe: Show all cached probes Masami Hiramatsu
2016-06-15  3:41 ` [PATCH perf/core v11 10/23] perf probe: Remove caches when --cache is given Masami Hiramatsu
2016-06-15  3:41 ` [PATCH perf/core v11 11/23] perf/sdt: ELF support for SDT Masami Hiramatsu
2016-06-15  3:41 ` [PATCH perf/core v11 12/23] perf probe: Add group name support Masami Hiramatsu
2016-06-15  3:41 ` [PATCH perf/core v11 13/23] perf buildid-cache: Scan and import user SDT events to probe cache Masami Hiramatsu
2016-06-15  3:41 ` [PATCH perf/core v11 14/23] perf probe: Accept %sdt and %cached event name Masami Hiramatsu
2016-06-15  3:41 ` [PATCH perf/core v11 15/23] perf-list: Show SDT and pre-cached events Masami Hiramatsu
2016-06-15  3:42 ` [PATCH perf/core v11 16/23] perf-list: Skip SDTs placed in invalid binaries Masami Hiramatsu
2016-06-15  3:42 ` [PATCH perf/core v11 17/23] perf: probe-cache: Add for_each_probe_cache_entry() wrapper Masami Hiramatsu
2016-06-15  3:42 ` [PATCH perf/core v11 18/23] perf probe: Allow wildcard for cached events Masami Hiramatsu
2016-06-15  3:42 ` [PATCH perf/core v11 19/23] perf probe: Search SDT/cached event from all probe caches Masami Hiramatsu
2016-06-15  3:42 ` [PATCH perf/core v11 20/23] perf probe: Support @BUILDID or @FILE suffix for SDT events Masami Hiramatsu
2016-06-15  3:42 ` [PATCH perf/core v11 21/23] perf probe: Support a special SDT probe format Masami Hiramatsu
2016-06-15  3:43 ` [PATCH perf/core v11 22/23] perf build: Add sdt feature detection Masami Hiramatsu
2016-06-15  3:43 ` [PATCH perf/core v11 23/23] perf-test: Add a test case for SDT event Masami Hiramatsu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20160615034009.2064.86862.stgit@devbox \
    --to=mhiramat@kernel.org \
    --cc=acme@kernel.org \
    --cc=ananth@linux.vnet.ibm.com \
    --cc=brendan.d.gregg@gmail.com \
    --cc=hemant@linux.vnet.ibm.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@redhat.com \
    --cc=namhyung@kernel.org \
    --cc=peterz@infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.