From 8aa2ed0b2839718b9147bb0119a8012217d25a8b Mon Sep 17 00:00:00 2001 From: Len Brown Date: Sat, 15 Jul 2017 14:57:37 -0400 Subject: [PATCH] tools/power turbostat: on SIGINT: sample, print and exit When running in interval-mode, catch interrupts and print a final data record before exiting. Signed-off-by: Len Brown --- tools/power/x86/turbostat/turbostat.8 | 4 ++++ tools/power/x86/turbostat/turbostat.c | 30 ++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/tools/power/x86/turbostat/turbostat.8 b/tools/power/x86/turbostat/turbostat.8 index 04262ab..2dafba4 100644 --- a/tools/power/x86/turbostat/turbostat.8 +++ b/tools/power/x86/turbostat/turbostat.8 @@ -267,6 +267,10 @@ CPU PRF_CTRL .fi +.SH SIGNALS + +SIGINT will interrupt interval-mode. +The end-of-interval data will be collected and displayed before turbostat exits. .SH NOTES .B "turbostat " diff --git a/tools/power/x86/turbostat/turbostat.c b/tools/power/x86/turbostat/turbostat.c index 627e574..d9703b7 100644 --- a/tools/power/x86/turbostat/turbostat.c +++ b/tools/power/x86/turbostat/turbostat.c @@ -2600,11 +2600,37 @@ int snapshot_proc_sysfs_files(void) return 0; } +int exit_requested; + +static void signal_handler (int signal) +{ + switch (signal) { + case SIGINT: + exit_requested = 1; + if (debug) + fprintf(stderr, " SIGINT\n"); + break; + } +} + +void setup_signal_handler(void) +{ + struct sigaction sa; + + memset(&sa, 0, sizeof(sa)); + + sa.sa_handler = &signal_handler; + + if (sigaction(SIGINT, &sa, NULL) < 0) + err(1, "sigaction SIGINT"); +} void turbostat_loop() { int retval; int restarted = 0; + setup_signal_handler(); + restart: restarted++; @@ -2646,6 +2672,8 @@ restart: compute_average(EVEN_COUNTERS); format_all_counters(EVEN_COUNTERS); flush_output_stdout(); + if (exit_requested) + break; nanosleep(&interval_ts, NULL); if (snapshot_proc_sysfs_files()) goto restart; @@ -2665,6 +2693,8 @@ restart: compute_average(ODD_COUNTERS); format_all_counters(ODD_COUNTERS); flush_output_stdout(); + if (exit_requested) + break; } } -- 2.7.4