perf header: Use argv style storage for cmdline feature data
authorJiri Olsa <jolsa@kernel.org>
Tue, 21 Jul 2015 12:31:31 +0000 (14:31 +0200)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Tue, 21 Jul 2015 17:34:08 +0000 (14:34 -0300)
We will reuse argv style data in following change to display counters
header showing monitored command line.

Signed-off-by: Jiri 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/1437481927-29538-12-git-send-email-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/header.c
tools/perf/util/header.h
tools/perf/util/session.c

index 03ace57a800c58fcc5fb3b2be8cd8bfbf8f50977..179b2bdd157dac0adc33faf62fbe85c3853aa19f 100644 (file)
@@ -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;
 }
 
index d4d57962c59129d6121b61921b1c1bf58fe2d12a..9b53b6525ce8ac00e712ef90736f7a9e1b95a306 100644 (file)
@@ -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;
index ed9dc2555ec7277d01560c1133718e1066dc5630..fb1d525ca3d09074eca1629ec119f1e363b79332 100644 (file)
@@ -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);