From: Jiri Olsa <jo...@kernel.org>

We will reuse argv style data in following change to display counters
header showing monitored command line.

Signed-off-by: Jiri Olsa <jo...@kernel.org>
Cc: David Ahern <dsah...@gmail.com>
Cc: Namhyung Kim <namhy...@kernel.org>
Cc: Peter Zijlstra <a.p.zijls...@chello.nl>
Link: 
http://lkml.kernel.org/r/1437481927-29538-12-git-send-email-jo...@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <a...@redhat.com>
---
 tools/perf/util/header.c  | 35 ++++++++++++++++++++---------------
 tools/perf/util/header.h  |  1 +
 tools/perf/util/session.c |  1 +
 3 files changed, 22 insertions(+), 15 deletions(-)

diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c
index 03ace57a800c..179b2bdd157d 100644
--- a/tools/perf/util/header.c
+++ b/tools/perf/util/header.c
@@ -923,17 +923,13 @@ static void print_cmdline(struct perf_header *ph, int fd 
__maybe_unused,
                          FILE *fp)
 {
        int nr, i;
-       char *str;
 
        nr = ph->env.nr_cmdline;
-       str = ph->env.cmdline;
 
        fprintf(fp, "# cmdline : ");
 
-       for (i = 0; i < nr; i++) {
-               fprintf(fp, "%s ", str);
-               str += strlen(str) + 1;
-       }
+       for (i = 0; i < nr; i++)
+               fprintf(fp, "%s ", ph->env.cmdline_argv[i]);
        fputc('\n', fp);
 }
 
@@ -1541,14 +1537,13 @@ process_event_desc(struct perf_file_section *section 
__maybe_unused,
        return 0;
 }
 
-static int process_cmdline(struct perf_file_section *section __maybe_unused,
+static int process_cmdline(struct perf_file_section *section,
                           struct perf_header *ph, int fd,
                           void *data __maybe_unused)
 {
        ssize_t ret;
-       char *str;
-       u32 nr, i;
-       struct strbuf sb;
+       char *str, *cmdline = NULL, **argv = NULL;
+       u32 nr, i, len = 0;
 
        ret = readn(fd, &nr, sizeof(nr));
        if (ret != sizeof(nr))
@@ -1558,22 +1553,32 @@ static int process_cmdline(struct perf_file_section 
*section __maybe_unused,
                nr = bswap_32(nr);
 
        ph->env.nr_cmdline = nr;
-       strbuf_init(&sb, 128);
+
+       cmdline = zalloc(section->size + nr + 1);
+       if (!cmdline)
+               return -1;
+
+       argv = zalloc(sizeof(char *) * (nr + 1));
+       if (!argv)
+               goto error;
 
        for (i = 0; i < nr; i++) {
                str = do_read_string(fd, ph);
                if (!str)
                        goto error;
 
-               /* include a NULL character at the end */
-               strbuf_add(&sb, str, strlen(str) + 1);
+               argv[i] = cmdline + len;
+               memcpy(argv[i], str, strlen(str) + 1);
+               len += strlen(str) + 1;
                free(str);
        }
-       ph->env.cmdline = strbuf_detach(&sb, NULL);
+       ph->env.cmdline = cmdline;
+       ph->env.cmdline_argv = (const char **) argv;
        return 0;
 
 error:
-       strbuf_release(&sb);
+       free(argv);
+       free(cmdline);
        return -1;
 }
 
diff --git a/tools/perf/util/header.h b/tools/perf/util/header.h
index d4d57962c591..9b53b6525ce8 100644
--- a/tools/perf/util/header.h
+++ b/tools/perf/util/header.h
@@ -84,6 +84,7 @@ struct perf_session_env {
        int                     nr_pmu_mappings;
        int                     nr_groups;
        char                    *cmdline;
+       const char              **cmdline_argv;
        char                    *sibling_cores;
        char                    *sibling_threads;
        char                    *numa_nodes;
diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
index ed9dc2555ec7..fb1d525ca3d0 100644
--- a/tools/perf/util/session.c
+++ b/tools/perf/util/session.c
@@ -180,6 +180,7 @@ static void perf_session_env__delete(struct 
perf_session_env *env)
        zfree(&env->cpuid);
 
        zfree(&env->cmdline);
+       zfree(&env->cmdline_argv);
        zfree(&env->sibling_cores);
        zfree(&env->sibling_threads);
        zfree(&env->numa_nodes);
-- 
2.1.0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to