From 47936f944e7816296888fb4c135f40635083080b Mon Sep 17 00:00:00 2001 From: Artem Bityutskiy Date: Wed, 4 Oct 2017 15:01:47 +0300 Subject: [PATCH] tools/power turbostat: fix printing on input The recent patch that implements table printing on a keypress introduced a regression - turbostat prints the table almost continuously if it is run from a daemon program. The problem is also easy to reproduce like this: echo | turbostat The reason is that we cannot assume that stdin is always a TTY. It can be many things. This patch adds fixes the problem by limiting the new keypress functionality to TTYs only. If stdin is not a TTY, we just sleep for the full interval time. While on it, clean-up 'do_sleep()' to return no value, as callers do not expect that anyway. Signed-off-by: Artem Bityutskiy Signed-off-by: Len Brown --- tools/power/x86/turbostat/turbostat.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/tools/power/x86/turbostat/turbostat.c b/tools/power/x86/turbostat/turbostat.c index 1d4ba4ade6fa..dd18aac6ccb2 100644 --- a/tools/power/x86/turbostat/turbostat.c +++ b/tools/power/x86/turbostat/turbostat.c @@ -49,6 +49,7 @@ char *proc_stat = "/proc/stat"; FILE *outf; int *fd_percpu; struct timeval interval_tv = {5, 0}; +struct timespec interval_ts = {5, 0}; struct timespec one_msec = {0, 1000000}; unsigned int debug; unsigned int quiet; @@ -2635,7 +2636,7 @@ void setup_signal_handler(void) err(1, "sigaction SIGUSR1"); } -int do_sleep(void) +void do_sleep(void) { struct timeval select_timeout; fd_set readfds; @@ -2644,12 +2645,15 @@ int do_sleep(void) FD_ZERO(&readfds); FD_SET(0, &readfds); - select_timeout = interval_tv; + if (!isatty(fileno(stdin))) { + nanosleep(&interval_ts, NULL); + return; + } + select_timeout = interval_tv; retval = select(1, &readfds, NULL, NULL, &select_timeout); if (retval == 1) { - switch (getc(stdin)) { case 'q': exit_requested = 1; @@ -2658,9 +2662,8 @@ int do_sleep(void) /* make sure this manually-invoked interval is at least 1ms long */ nanosleep(&one_msec, NULL); } - - return retval; } + void turbostat_loop() { int retval; @@ -5134,8 +5137,9 @@ void cmdline(int argc, char **argv) exit(2); } - interval_tv.tv_sec = interval; + interval_tv.tv_sec = interval_ts.tv_sec = interval; interval_tv.tv_usec = (interval - interval_tv.tv_sec) * 1000000; + interval_ts.tv_nsec = (interval - interval_ts.tv_sec) * 1000000000; } break; case 'J': -- GitLab