aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/builtin-stat.c
diff options
context:
space:
mode:
authorJim Cromie <jim.cromie@gmail.com>2011-09-07 19:14:00 -0400
committerArnaldo Carvalho de Melo <acme@redhat.com>2011-09-29 16:03:23 -0400
commit56f3bae70638b33477a6015fd362ccfe354fd3ee (patch)
tree27f0a07cf5662f742e07f001c66ae9cf8f59d209 /tools/perf/builtin-stat.c
parentdcc101d1d02eb80ab0349c5410f8728412c35636 (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.c14
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;
196static bool group = false; 196static bool group = false;
197static const char *output_name = NULL; 197static const char *output_name = NULL;
198static FILE *output = NULL; 198static FILE *output = NULL;
199static int output_fd;
199 200
200static volatile int done = 0; 201static 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)