diff options
author | Artem Bityutskiy <artem.bityutskiy@linux.intel.com> | 2017-10-04 15:01:47 +0300 |
---|---|---|
committer | Len Brown <len.brown@intel.com> | 2018-06-01 12:13:05 -0400 |
commit | 47936f944e7816296888fb4c135f40635083080b (patch) | |
tree | 37f1a60f99190a7b19887dce26cf739ec0c0503b /tools/power | |
parent | b9ad8ee0da54b2b4d2f8cd50fc9ce5200d61e7d1 (diff) |
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 <artem.bityutskiy@linux.intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'tools/power')
-rw-r--r-- | tools/power/x86/turbostat/turbostat.c | 16 |
1 files 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': |