aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf
diff options
context:
space:
mode:
authorJiri Olsa <jolsa@kernel.org>2014-08-11 04:50:07 -0400
committerArnaldo Carvalho de Melo <acme@redhat.com>2014-08-13 11:42:24 -0400
commit4a1a99712a8a13d97e9de818869bf1b88583d6bc (patch)
treef56ff73864bd93281e4ccd1f872d6fb59bc8c71b /tools/perf
parent9398c484f8abc8d287cb90f5a33dd43ac26f24ef (diff)
perf top: Setup signals for terminal output
The TUI code setup standard signals handling, while the stdio display code does not. This leads to premature termination of display thread when signal is received and leaving terminal in wrong state. Also adding terminal cleanup at the end of display thread, to ensure we get the old terminal state in case of signal interruption. Signed-off-by: Jiri Olsa <jolsa@kernel.org> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com> Cc: David Ahern <dsahern@gmail.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Ingo Molnar <mingo@kernel.org> Cc: Jean Pihet <jean.pihet@linaro.org> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Link: http://lkml.kernel.org/r/1407747014-18394-14-git-send-email-jolsa@kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf')
-rw-r--r--tools/perf/builtin-top.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c
index e8459e260c3b..0ab3ea7f7525 100644
--- a/tools/perf/builtin-top.c
+++ b/tools/perf/builtin-top.c
@@ -577,6 +577,20 @@ static void *display_thread_tui(void *arg)
577 return NULL; 577 return NULL;
578} 578}
579 579
580static void display_sig(int sig __maybe_unused)
581{
582 done = 1;
583}
584
585static void display_setup_sig(void)
586{
587 signal(SIGSEGV, display_sig);
588 signal(SIGFPE, display_sig);
589 signal(SIGINT, display_sig);
590 signal(SIGQUIT, display_sig);
591 signal(SIGTERM, display_sig);
592}
593
580static void *display_thread(void *arg) 594static void *display_thread(void *arg)
581{ 595{
582 struct pollfd stdin_poll = { .fd = 0, .events = POLLIN }; 596 struct pollfd stdin_poll = { .fd = 0, .events = POLLIN };
@@ -584,6 +598,7 @@ static void *display_thread(void *arg)
584 struct perf_top *top = arg; 598 struct perf_top *top = arg;
585 int delay_msecs, c; 599 int delay_msecs, c;
586 600
601 display_setup_sig();
587 pthread__unblock_sigwinch(); 602 pthread__unblock_sigwinch();
588repeat: 603repeat:
589 delay_msecs = top->delay_secs * 1000; 604 delay_msecs = top->delay_secs * 1000;
@@ -614,6 +629,7 @@ repeat:
614 } 629 }
615 } 630 }
616 631
632 tcsetattr(0, TCSAFLUSH, &save);
617 return NULL; 633 return NULL;
618} 634}
619 635