perf stat: fix default output file
PATCH 1/1 perf stat: fix default output file
The following commit:
commit 56f3bae70638b33477a6015fd362ccfe354fd3ee
Author: Jim Cromie <[email protected]> Date: Wed Sep 7 17:14:00 2011 -0600
perf stat: Add --log-fd <N> option to redirect stderr elsewhere
introduced a bug in the way perf stat outputs the results by default, i.e., without the --log-fd or --output option. It would default to writing to file descriptor 0, i.e., stdin. Writing to stdin is allowed and is equivalent to writing to stdout. However, there is a major difference for any script that was already capturing the output of perf stat via redirection:
perf stat >/tmp/log .... or perf stat 2>/tmp/log ....
They would not capture anything anymore. They would have to do:
perf stat 0>/tmp/log ...
This breaks compatibility with existing scripts and does not look very natural.
This patch fixes the problem by looking at output_fd only when it was modified by user (> 0). It also checks that the value if positive. Passing --log-fd 0 is ignored.
I would also argue that defaulting to stderr for the results is not the right thing to do, though this patch does not address this specific issue.
---
tools/perf/builtin-stat.c +7 -1
@@ -1179,6 +1179,12 @@ int cmd_stat(int argc, const char **argv, const char *prefix __used)fprintf (stderr,"cannot use both --output and --log-fd\n" );usage_with_options (stat_usage, options); } + +if (output_fd <0 ) { +fprintf (stderr,"argument to --log-fd must be a > 0\n" ); +usage_with_options (stat_usage, options); + } +if (!output) {struct timespec tm; mode = append_file ?"a" :"w" ;
@@ -1190,7 +1196,7 @@ int cmd_stat(int argc, const char **argv, const char *prefix __used) }clock_gettime (CLOCK_REALTIME , &tm);fprintf (output,"# started on %s\n" ,ctime (&tm.tv_sec)); - }else if (output_fd !=2 ) { + }else if (output_fd >0 ) { mode = append_file ?"a" :"w" ; output =fdopen (output_fd, mode);if (!output) {
Ping?
Quoted 60 lines · Stephane Eranian
The following commit:
commit
56f3bae70638b33477a6015fd362ccfe354fd3ee
Author: Jim Cromie <[email protected]>
Date: Wed Sep 7 17:14:00 2011 -0600perf stat: Add --log-fd <N> option to redirect stderr elsewhere
introduced a bug in the way perf stat outputs the results by default, i.e., without the --log-fd or --output option. It would default to writing to file descriptor 0, i.e., stdin. Writing to stdin is allowed and is equivalent to writing to stdout. However, there is a major difference for any script that was already capturing the output of perf stat via redirection:
perf stat >/tmp/log .... or perf stat 2>/tmp/log ....
They would not capture anything anymore. They would have to do:
perf stat 0>/tmp/log ...This breaks compatibility with existing scripts and does not look very natural.
This patch fixes the problem by looking at
output_fdonly when it was modified by user (> 0). It also checks that the value if positive. Passing --log-fd 0 is ignored.I would also argue that defaulting to stderr for the results is not the right thing to do, though this patch does not address this specific issue.
Signed-off-by Stephane Eranian <[email protected]>---
tools/perf/builtin-stat.c +7
-1@@ -1179,6 +1179,12 @@ int cmd_stat(int argc, const char **argv, const char *prefix __used) fprintf(stderr, "cannot use both --output and --log-fd\n"); usage_with_options(stat_usage, options); } + + if (output_fd < 0) { + fprintf(stderr, "argument to --log-fd must be a > 0\n"); + usage_with_options(stat_usage, options); + } + if (!output) { struct timespec tm; mode = append_file ? "a" : "w";@@ -1190,7 +1196,7 @@ int cmd_stat(int argc, const char **argv, const char *prefix __used) } clock_gettime(CLOCK_REALTIME, &tm); fprintf(output, "# started on %s\n", ctime(&tm.tv_sec)); - } else if (output_fd != 2) { + } else if (output_fd > 0) { mode = append_file ? "a" : "w"; output = fdopen(output_fd, mode); if (!output) {
[tip:perf/urgent] perf stat: Fix default output file
In reply to Stephane EranianCommit-ID: fc3e4d077d5c7a7bc1ad5bc143895b4e070e5a8b Gitweb: http://git.kernel.org/tip/fc3e4d077d5c7a7bc1ad5bc143895b4e070e5a8b Author: Stephane Eranian <[email protected]> AuthorDate: Tue, 15 May 2012 13:11:11 +0200 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Mon, 11 Jun 2012 11:20:21 -0300
perf stat: Fix default output file
The following commit:
commit 56f3bae70638b33477a6015fd362ccfe354fd3ee
Author: Jim Cromie <[email protected]> Date: Wed Sep 7 17:14:00 2011 -0600
perf stat: Add --log-fd <N> option to redirect stderr elsewhere
introduced a bug in the way perf stat outputs the results by default, i.e., without the --log-fd or --output option. It would default to writing to file descriptor 0, i.e., stdin. Writing to stdin is allowed and is equivalent to writing to stdout. However, there is a major difference for any script that was already capturing the output of perf stat via redirection:
perf stat >/tmp/log .... or perf stat 2>/tmp/log ....
They would not capture anything anymore. They would have to do:
perf stat 0>/tmp/log ...
This breaks compatibility with existing scripts and does not look very natural.
This patch fixes the problem by looking at output_fd only when it was modified by user (> 0). It also checks that the value if positive. Passing --log-fd 0 is ignored.
I would also argue that defaulting to stderr for the results is not the right thing to do, though this patch does not address this specific issue.
--- tools/perf/builtin-stat.c | 8 +++++++- 1 files changed, 7 insertions(+), 1 deletions(-)
tools/perf/builtin-stat.c +7 -1
@@ -1179,6 +1179,12 @@ int cmd_stat(int argc, const char **argv, const char *prefix __used)fprintf (stderr,"cannot use both --output and --log-fd\n" );usage_with_options (stat_usage, options); } + +if (output_fd <0 ) { +fprintf (stderr,"argument to --log-fd must be a > 0\n" ); +usage_with_options (stat_usage, options); + } +if (!output) {struct timespec tm; mode = append_file ?"a" :"w" ;
@@ -1190,7 +1196,7 @@ int cmd_stat(int argc, const char **argv, const char *prefix __used) }clock_gettime (CLOCK_REALTIME , &tm);fprintf (output,"# started on %s\n" ,ctime (&tm.tv_sec)); - }else if (output_fd !=2 ) { + }else if (output_fd >0 ) { mode = append_file ?"a" :"w" ; output =fdopen (output_fd, mode);if (!output) {