Commit c026c236 authored by Artem Bityutskiy's avatar Artem Bityutskiy Committed by Len Brown

tools/power turbostat: read from pipes too

Commit '47936f94 tools/power turbostat: fix printing on input' make
a valid fix, but it completely disabled piped stdin support, which is
a valuable use-case. Indeed, if stdin is a pipe, turbostat won't read
anything from it, so it becomes impossible to get turbostat output at
user-defined moments, instead of the regular intervals.

There is no reason why this should works for terminals, but not for
pipes. This patch improves the situation. Instead of ignoring pipes, we
read data from them but gracefully handle the EOF case.
Signed-off-by: default avatarArtem Bityutskiy <artem.bityutskiy@linux.intel.com>
Signed-off-by: default avatarLen Brown <len.brown@intel.com>
parent d93ea567
...@@ -100,6 +100,7 @@ unsigned int has_hwp_epp; /* IA32_HWP_REQUEST[bits 31:24] */ ...@@ -100,6 +100,7 @@ unsigned int has_hwp_epp; /* IA32_HWP_REQUEST[bits 31:24] */
unsigned int has_hwp_pkg; /* IA32_HWP_REQUEST_PKG */ unsigned int has_hwp_pkg; /* IA32_HWP_REQUEST_PKG */
unsigned int has_misc_feature_control; unsigned int has_misc_feature_control;
unsigned int first_counter_read = 1; unsigned int first_counter_read = 1;
int ignore_stdin;
#define RAPL_PKG (1 << 0) #define RAPL_PKG (1 << 0)
/* 0x610 MSR_PKG_POWER_LIMIT */ /* 0x610 MSR_PKG_POWER_LIMIT */
...@@ -3013,26 +3014,37 @@ void setup_signal_handler(void) ...@@ -3013,26 +3014,37 @@ void setup_signal_handler(void)
void do_sleep(void) void do_sleep(void)
{ {
struct timeval select_timeout; struct timeval tout;
struct timespec rest;
fd_set readfds; fd_set readfds;
int retval; int retval;
FD_ZERO(&readfds); FD_ZERO(&readfds);
FD_SET(0, &readfds); FD_SET(0, &readfds);
if (!isatty(fileno(stdin))) { if (ignore_stdin) {
nanosleep(&interval_ts, NULL); nanosleep(&interval_ts, NULL);
return; return;
} }
select_timeout = interval_tv; tout = interval_tv;
retval = select(1, &readfds, NULL, NULL, &select_timeout); retval = select(1, &readfds, NULL, NULL, &tout);
if (retval == 1) { if (retval == 1) {
switch (getc(stdin)) { switch (getc(stdin)) {
case 'q': case 'q':
exit_requested = 1; exit_requested = 1;
break; break;
case EOF:
/*
* 'stdin' is a pipe closed on the other end. There
* won't be any further input.
*/
ignore_stdin = 1;
/* Sleep the rest of the time */
rest.tv_sec = (tout.tv_sec + tout.tv_usec / 1000000);
rest.tv_nsec = (tout.tv_usec % 1000000) * 1000;
nanosleep(&rest, NULL);
} }
/* make sure this manually-invoked interval is at least 1ms long */ /* make sure this manually-invoked interval is at least 1ms long */
nanosleep(&one_msec, NULL); nanosleep(&one_msec, NULL);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment