diff options
author | Jim Cromie <jim.cromie@gmail.com> | 2011-09-07 19:14:00 -0400 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2011-09-29 16:03:23 -0400 |
commit | 56f3bae70638b33477a6015fd362ccfe354fd3ee (patch) | |
tree | 27f0a07cf5662f742e07f001c66ae9cf8f59d209 /tools/perf/builtin-stat.c | |
parent | dcc101d1d02eb80ab0349c5410f8728412c35636 (diff) |
perf stat: Add --log-fd <N> option to redirect stderr elsewhere
This perf stat option emulates valgrind's --log-fd option, allowing the
user to send perf results elsewhere, and leaving stderr for use by the
program under test. This complements --output file option, and is
mutually exclusive with it.
3>results perf stat --log-fd 3 -- $cmd
3>>results perf stat --log-fd 3 --append -- $cmd
The perl distro's make test.valgrind target uses valgrind's --log-fd
option, I've adapted it to invoke perf also, and tested this patch
there.
Link: http://lkml.kernel.org/r/1315437244-3788-2-git-send-email-jim.cromie@gmail.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: Jim Cromie <jim.cromie@gmail.com>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf/builtin-stat.c')
-rw-r--r-- | tools/perf/builtin-stat.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index bec64a9e741c..a43c68051078 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c | |||
@@ -196,6 +196,7 @@ static bool csv_output = false; | |||
196 | static bool group = false; | 196 | static bool group = false; |
197 | static const char *output_name = NULL; | 197 | static const char *output_name = NULL; |
198 | static FILE *output = NULL; | 198 | static FILE *output = NULL; |
199 | static int output_fd; | ||
199 | 200 | ||
200 | static volatile int done = 0; | 201 | static volatile int done = 0; |
201 | 202 | ||
@@ -1080,6 +1081,8 @@ static const struct option options[] = { | |||
1080 | OPT_STRING('o', "output", &output_name, "file", | 1081 | OPT_STRING('o', "output", &output_name, "file", |
1081 | "output file name"), | 1082 | "output file name"), |
1082 | OPT_BOOLEAN(0, "append", &append_file, "append to the output file"), | 1083 | OPT_BOOLEAN(0, "append", &append_file, "append to the output file"), |
1084 | OPT_INTEGER(0, "log-fd", &output_fd, | ||
1085 | "log output to fd, instead of stderr"), | ||
1083 | OPT_END() | 1086 | OPT_END() |
1084 | }; | 1087 | }; |
1085 | 1088 | ||
@@ -1166,6 +1169,10 @@ int cmd_stat(int argc, const char **argv, const char *prefix __used) | |||
1166 | if (output_name && strcmp(output_name, "-")) | 1169 | if (output_name && strcmp(output_name, "-")) |
1167 | output = NULL; | 1170 | output = NULL; |
1168 | 1171 | ||
1172 | if (output_name && output_fd) { | ||
1173 | fprintf(stderr, "cannot use both --output and --log-fd\n"); | ||
1174 | usage_with_options(stat_usage, options); | ||
1175 | } | ||
1169 | if (!output) { | 1176 | if (!output) { |
1170 | struct timespec tm; | 1177 | struct timespec tm; |
1171 | mode = append_file ? "a" : "w"; | 1178 | mode = append_file ? "a" : "w"; |
@@ -1177,6 +1184,13 @@ int cmd_stat(int argc, const char **argv, const char *prefix __used) | |||
1177 | } | 1184 | } |
1178 | clock_gettime(CLOCK_REALTIME, &tm); | 1185 | clock_gettime(CLOCK_REALTIME, &tm); |
1179 | fprintf(output, "# started on %s\n", ctime(&tm.tv_sec)); | 1186 | fprintf(output, "# started on %s\n", ctime(&tm.tv_sec)); |
1187 | } else if (output_fd != 2) { | ||
1188 | mode = append_file ? "a" : "w"; | ||
1189 | output = fdopen(output_fd, mode); | ||
1190 | if (!output) { | ||
1191 | perror("Failed opening logfd"); | ||
1192 | return -errno; | ||
1193 | } | ||
1180 | } | 1194 | } |
1181 | 1195 | ||
1182 | if (csv_sep) | 1196 | if (csv_sep) |