Allow perf top --stdio to run without access to stdin.
This lets perf top to run in a batch mode until interrupted.

The following now works as expected:

  $ perf top < /dev/null

Signed-off-by: Igor Lubashev <iluba...@akamai.com>
---
 tools/perf/builtin-top.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c
index d96f24c8770d..fbc0dc135b8a 100644
--- a/tools/perf/builtin-top.c
+++ b/tools/perf/builtin-top.c
@@ -665,6 +665,7 @@ static void display_setup_sig(void)
 static void *display_thread(void *arg)
 {
        struct pollfd stdin_poll = { .fd = 0, .events = POLLIN };
+       nfds_t nfds = 1;
        struct termios save;
        struct perf_top *top = arg;
        int delay_msecs, c;
@@ -684,7 +685,8 @@ static void *display_thread(void *arg)
        delay_msecs = top->delay_secs * MSEC_PER_SEC;
        set_term_quiet_input(&save);
        /* trash return*/
-       getc(stdin);
+       if (getc(stdin) == EOF)
+               nfds = 0;
 
        while (!done) {
                perf_top__print_sym_table(top);
@@ -692,7 +694,7 @@ static void *display_thread(void *arg)
                 * Either timeout expired or we got an EINTR due to SIGWINCH,
                 * refresh screen in both cases.
                 */
-               switch (poll(&stdin_poll, 1, delay_msecs)) {
+               switch (poll(&stdin_poll, nfds, delay_msecs)) {
                case 0:
                        continue;
                case -1:
@@ -701,6 +703,10 @@ static void *display_thread(void *arg)
                        __fallthrough;
                default:
                        c = getc(stdin);
+                       if (c == EOF) {
+                               nfds = 0;
+                               continue;
+                       }
                        tcsetattr(0, TCSAFLUSH, &save);
 
                        if (perf_top__handle_keypress(top, c))
-- 
2.7.4

Reply via email to