diff options
Diffstat (limited to 'tools/perf/builtin-trace.c')
-rw-r--r-- | tools/perf/builtin-trace.c | 75 |
1 files changed, 74 insertions, 1 deletions
diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c index 8fc50d831540..2eefb33c9679 100644 --- a/tools/perf/builtin-trace.c +++ b/tools/perf/builtin-trace.c | |||
@@ -104,10 +104,23 @@ static int process_sample_event(event_t *event, struct perf_session *session) | |||
104 | static struct perf_event_ops event_ops = { | 104 | static struct perf_event_ops event_ops = { |
105 | .sample = process_sample_event, | 105 | .sample = process_sample_event, |
106 | .comm = event__process_comm, | 106 | .comm = event__process_comm, |
107 | .attr = event__process_attr, | ||
108 | .event_type = event__process_event_type, | ||
109 | .tracing_data = event__process_tracing_data, | ||
110 | .build_id = event__process_build_id, | ||
107 | }; | 111 | }; |
108 | 112 | ||
113 | extern volatile int session_done; | ||
114 | |||
115 | static void sig_handler(int sig __unused) | ||
116 | { | ||
117 | session_done = 1; | ||
118 | } | ||
119 | |||
109 | static int __cmd_trace(struct perf_session *session) | 120 | static int __cmd_trace(struct perf_session *session) |
110 | { | 121 | { |
122 | signal(SIGINT, sig_handler); | ||
123 | |||
111 | return perf_session__process_events(session, &event_ops); | 124 | return perf_session__process_events(session, &event_ops); |
112 | } | 125 | } |
113 | 126 | ||
@@ -548,6 +561,65 @@ int cmd_trace(int argc, const char **argv, const char *prefix __used) | |||
548 | suffix = REPORT_SUFFIX; | 561 | suffix = REPORT_SUFFIX; |
549 | } | 562 | } |
550 | 563 | ||
564 | if (!suffix && argc >= 2 && strncmp(argv[1], "-", strlen("-")) != 0) { | ||
565 | char *record_script_path, *report_script_path; | ||
566 | int live_pipe[2]; | ||
567 | pid_t pid; | ||
568 | |||
569 | record_script_path = get_script_path(argv[1], RECORD_SUFFIX); | ||
570 | if (!record_script_path) { | ||
571 | fprintf(stderr, "record script not found\n"); | ||
572 | return -1; | ||
573 | } | ||
574 | |||
575 | report_script_path = get_script_path(argv[1], REPORT_SUFFIX); | ||
576 | if (!report_script_path) { | ||
577 | fprintf(stderr, "report script not found\n"); | ||
578 | return -1; | ||
579 | } | ||
580 | |||
581 | if (pipe(live_pipe) < 0) { | ||
582 | perror("failed to create pipe"); | ||
583 | exit(-1); | ||
584 | } | ||
585 | |||
586 | pid = fork(); | ||
587 | if (pid < 0) { | ||
588 | perror("failed to fork"); | ||
589 | exit(-1); | ||
590 | } | ||
591 | |||
592 | if (!pid) { | ||
593 | dup2(live_pipe[1], 1); | ||
594 | close(live_pipe[0]); | ||
595 | |||
596 | __argv = malloc(5 * sizeof(const char *)); | ||
597 | __argv[0] = "/bin/sh"; | ||
598 | __argv[1] = record_script_path; | ||
599 | __argv[2] = "-o"; | ||
600 | __argv[3] = "-"; | ||
601 | __argv[4] = NULL; | ||
602 | |||
603 | execvp("/bin/sh", (char **)__argv); | ||
604 | exit(-1); | ||
605 | } | ||
606 | |||
607 | dup2(live_pipe[0], 0); | ||
608 | close(live_pipe[1]); | ||
609 | |||
610 | __argv = malloc((argc + 3) * sizeof(const char *)); | ||
611 | __argv[0] = "/bin/sh"; | ||
612 | __argv[1] = report_script_path; | ||
613 | for (i = 2; i < argc; i++) | ||
614 | __argv[i] = argv[i]; | ||
615 | __argv[i++] = "-i"; | ||
616 | __argv[i++] = "-"; | ||
617 | __argv[i++] = NULL; | ||
618 | |||
619 | execvp("/bin/sh", (char **)__argv); | ||
620 | exit(-1); | ||
621 | } | ||
622 | |||
551 | if (suffix) { | 623 | if (suffix) { |
552 | script_path = get_script_path(argv[2], suffix); | 624 | script_path = get_script_path(argv[2], suffix); |
553 | if (!script_path) { | 625 | if (!script_path) { |
@@ -580,7 +652,8 @@ int cmd_trace(int argc, const char **argv, const char *prefix __used) | |||
580 | if (session == NULL) | 652 | if (session == NULL) |
581 | return -ENOMEM; | 653 | return -ENOMEM; |
582 | 654 | ||
583 | if (!perf_session__has_traces(session, "record -R")) | 655 | if (strcmp(input_name, "-") && |
656 | !perf_session__has_traces(session, "record -R")) | ||
584 | return -EINVAL; | 657 | return -EINVAL; |
585 | 658 | ||
586 | if (generate_script_lang) { | 659 | if (generate_script_lang) { |