perf tui: Catch signals to exit gracefully
authorArnaldo Carvalho de Melo <acme@redhat.com>
Tue, 18 Oct 2011 15:45:16 +0000 (13:45 -0200)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Tue, 18 Oct 2011 16:00:25 +0000 (14:00 -0200)
Resetting the terminal to a sane state.

Reported-by: Ingo Molnar <mingo@elte.hu>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-myu44ujofadcy3y6an2mk383@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/ui/setup.c

index ee46d671db5990a9c453447e065bf95864943385..8b8a57b455601805d31f36eca7f1ae332be5b412 100644 (file)
@@ -7,6 +7,7 @@
 #include "browser.h"
 #include "helpline.h"
 #include "ui.h"
+#include "libslang.h"
 
 pthread_mutex_t ui__lock = PTHREAD_MUTEX_INITIALIZER;
 
@@ -17,6 +18,21 @@ static void newt_suspend(void *d __used)
        newtResume();
 }
 
+static void ui__exit(void)
+{
+       SLtt_set_cursor_visibility(1);
+       SLsmg_refresh();
+       SLsmg_reset_smg();
+       SLang_reset_tty();
+}
+
+static void ui__signal(int sig)
+{
+       ui__exit();
+       psignal(sig, "perf");
+       exit(0);
+}
+
 void setup_browser(bool fallback_to_pager)
 {
        if (!isatty(1) || !use_browser || dump_trace) {
@@ -32,6 +48,12 @@ void setup_browser(bool fallback_to_pager)
        newtSetSuspendCallback(newt_suspend, NULL);
        ui_helpline__init();
        ui_browser__init();
+
+       signal(SIGSEGV, ui__signal);
+       signal(SIGFPE, ui__signal);
+       signal(SIGINT, ui__signal);
+       signal(SIGQUIT, ui__signal);
+       signal(SIGTERM, ui__signal);
 }
 
 void exit_browser(bool wait_for_ok)
@@ -41,6 +63,6 @@ void exit_browser(bool wait_for_ok)
                        char title[] = "Fatal Error", ok[] = "Ok";
                        newtWinMessage(title, ok, ui_helpline__last_msg);
                }
-               newtFinished();
+               ui__exit();
        }
 }