From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752849AbaHKIvI (ORCPT ); Mon, 11 Aug 2014 04:51:08 -0400 Received: from mx1.redhat.com ([209.132.183.28]:20183 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752824AbaHKIvE (ORCPT ); Mon, 11 Aug 2014 04:51:04 -0400 From: Jiri Olsa To: linux-kernel@vger.kernel.org Cc: Jiri Olsa , Adrian Hunter , Arnaldo Carvalho de Melo , Corey Ashford , David Ahern , Frederic Weisbecker , Ingo Molnar , Jean Pihet , Namhyung Kim , Paul Mackerras , Peter Zijlstra Subject: [PATCH 13/20] perf top: Setup signals for terminal output Date: Mon, 11 Aug 2014 10:50:07 +0200 Message-Id: <1407747014-18394-14-git-send-email-jolsa@kernel.org> In-Reply-To: <1407747014-18394-1-git-send-email-jolsa@kernel.org> References: <1407747014-18394-1-git-send-email-jolsa@kernel.org> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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. Cc: Adrian Hunter Cc: Arnaldo Carvalho de Melo Cc: Corey Ashford Cc: David Ahern Cc: Frederic Weisbecker Cc: Ingo Molnar Cc: Jean Pihet Cc: Namhyung Kim Cc: Paul Mackerras Cc: Peter Zijlstra Signed-off-by: Jiri Olsa --- tools/perf/builtin-top.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c index f19321282436..9b4edf0bd49f 100644 --- a/tools/perf/builtin-top.c +++ b/tools/perf/builtin-top.c @@ -579,6 +579,20 @@ static void *display_thread_tui(void *arg) return NULL; } +static void display_sig(int sig __maybe_unused) +{ + done = 1; +} + +static void display_setup_sig(void) +{ + signal(SIGSEGV, display_sig); + signal(SIGFPE, display_sig); + signal(SIGINT, display_sig); + signal(SIGQUIT, display_sig); + signal(SIGTERM, display_sig); +} + static void *display_thread(void *arg) { struct pollfd stdin_poll = { .fd = 0, .events = POLLIN }; @@ -586,6 +600,7 @@ static void *display_thread(void *arg) struct perf_top *top = arg; int delay_msecs, c; + display_setup_sig(); pthread__unblock_sigwinch(); repeat: delay_msecs = top->delay_secs * 1000; @@ -616,6 +631,7 @@ repeat: } } + tcsetattr(0, TCSAFLUSH, &save); return NULL; } -- 1.8.3.1