perf inject: Handle output file via perf_data_file object
authorJiri Olsa <jolsa@redhat.com>
Tue, 29 Oct 2013 18:04:57 +0000 (19:04 +0100)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Thu, 19 Dec 2013 14:38:49 +0000 (11:38 -0300)
Using the perf_data_file object to handle output file processing.

No functional change intended.

Signed-off-by: Jiri Olsa <jolsa@redhat.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/n/tip-01j9ophd7tntmgrxa40uqjjm@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/builtin-inject.c

index 6a2508589460bfc1fec37c10163cf44b95a2ddfc..c9f6d74e1fd7e2e76b48bca3320cb44d6b2a3263 100644 (file)
 #include <linux/list.h>
 
 struct perf_inject {
-       struct perf_tool tool;
-       bool             build_ids;
-       bool             sched_stat;
-       const char       *input_name;
-       int              pipe_output,
-                        output;
-       u64              bytes_written;
-       struct list_head samples;
+       struct perf_tool        tool;
+       bool                    build_ids;
+       bool                    sched_stat;
+       const char              *input_name;
+       struct perf_data_file   output;
+       u64                     bytes_written;
+       struct list_head        samples;
 };
 
 struct event_entry {
@@ -42,21 +41,14 @@ static int perf_event__repipe_synth(struct perf_tool *tool,
                                    union perf_event *event)
 {
        struct perf_inject *inject = container_of(tool, struct perf_inject, tool);
-       uint32_t size;
-       void *buf = event;
+       ssize_t size;
 
-       size = event->header.size;
-
-       while (size) {
-               int ret = write(inject->output, buf, size);
-               if (ret < 0)
-                       return -errno;
-
-               size -= ret;
-               buf += ret;
-               inject->bytes_written += ret;
-       }
+       size = perf_data_file__write(&inject->output, event,
+                                    event->header.size);
+       if (size < 0)
+               return -errno;
 
+       inject->bytes_written += size;
        return 0;
 }
 
@@ -80,7 +72,7 @@ static int perf_event__repipe_attr(struct perf_tool *tool,
        if (ret)
                return ret;
 
-       if (!inject->pipe_output)
+       if (&inject->output.is_pipe)
                return 0;
 
        return perf_event__repipe_synth(tool, event);
@@ -355,6 +347,7 @@ static int __cmd_inject(struct perf_inject *inject)
                .path = inject->input_name,
                .mode = PERF_DATA_MODE_READ,
        };
+       struct perf_data_file *file_out = &inject->output;
 
        signal(SIGINT, sig_handler);
 
@@ -391,14 +384,14 @@ static int __cmd_inject(struct perf_inject *inject)
                }
        }
 
-       if (!inject->pipe_output)
-               lseek(inject->output, session->header.data_offset, SEEK_SET);
+       if (!file_out->is_pipe)
+               lseek(file_out->fd, session->header.data_offset, SEEK_SET);
 
        ret = perf_session__process_events(session, &inject->tool);
 
-       if (!inject->pipe_output) {
+       if (!file_out->is_pipe) {
                session->header.data_size = inject->bytes_written;
-               perf_session__write_header(session, session->evlist, inject->output, true);
+               perf_session__write_header(session, session->evlist, file_out->fd, true);
        }
 
        perf_session__delete(session);
@@ -427,14 +420,17 @@ int cmd_inject(int argc, const char **argv, const char *prefix __maybe_unused)
                },
                .input_name  = "-",
                .samples = LIST_HEAD_INIT(inject.samples),
+               .output = {
+                       .path = "-",
+                       .mode = PERF_DATA_MODE_WRITE,
+               },
        };
-       const char *output_name = "-";
        const struct option options[] = {
                OPT_BOOLEAN('b', "build-ids", &inject.build_ids,
                            "Inject build-ids into the output stream"),
                OPT_STRING('i', "input", &inject.input_name, "file",
                           "input file name"),
-               OPT_STRING('o', "output", &output_name, "file",
+               OPT_STRING('o', "output", &inject.output.path, "file",
                           "output file name"),
                OPT_BOOLEAN('s', "sched-stat", &inject.sched_stat,
                            "Merge sched-stat and sched-switch for getting events "
@@ -456,16 +452,9 @@ int cmd_inject(int argc, const char **argv, const char *prefix __maybe_unused)
        if (argc)
                usage_with_options(inject_usage, options);
 
-       if (!strcmp(output_name, "-")) {
-               inject.pipe_output = 1;
-               inject.output = STDOUT_FILENO;
-       } else {
-               inject.output = open(output_name, O_CREAT | O_WRONLY | O_TRUNC,
-                                                 S_IRUSR | S_IWUSR);
-               if (inject.output < 0) {
-                       perror("failed to create output file");
-                       return -1;
-               }
+       if (perf_data_file__open(&inject.output)) {
+               perror("failed to create output file");
+               return -1;
        }
 
        if (symbol__init() < 0)