summary refs log tree commit diff
path: root/tools
diff options
context:
space:
mode:
authorArtem Bityutskiy <artem.bityutskiy@linux.intel.com>2017-10-04 15:01:47 +0300
committerLen Brown <len.brown@intel.com>2018-06-01 12:13:05 -0400
commit47936f944e7816296888fb4c135f40635083080b (patch)
tree37f1a60f99190a7b19887dce26cf739ec0c0503b /tools
parentb9ad8ee0da54b2b4d2f8cd50fc9ce5200d61e7d1 (diff)
downloadlinux-47936f944e7816296888fb4c135f40635083080b.tar.gz
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')
-rw-r--r--tools/power/x86/turbostat/turbostat.c16
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':