6 #include <linux/kernel.h>
7 #ifdef HAVE_BACKTRACE_SUPPORT
11 #include "../../util/debug.h"
12 #include "../browser.h"
13 #include "../helpline.h"
16 #include "../libslang.h"
17 #include "../keysyms.h"
20 static volatile int ui__need_resize;
22 extern struct perf_error_ops perf_tui_eops;
23 extern bool tui_helpline__set;
25 extern void hist_browser__init_hpp(void);
27 void ui__refresh_dimensions(bool force)
29 if (force || ui__need_resize) {
31 mutex_lock(&ui__lock);
32 SLtt_get_screen_size();
34 mutex_unlock(&ui__lock);
38 static void ui__sigwinch(int sig __maybe_unused)
43 static void ui__setup_sigwinch(void)
51 pthread__unblock_sigwinch();
52 signal(SIGWINCH, ui__sigwinch);
55 int ui__getch(int delay_secs)
57 struct timeval timeout, *ptimeout = delay_secs ? &timeout : NULL;
67 timeout.tv_sec = delay_secs;
71 err = select(1, &read_set, NULL, NULL, ptimeout);
90 err = select(1, &read_set, NULL, NULL, &timeout);
98 #ifdef HAVE_BACKTRACE_SUPPORT
99 static void ui__signal_backtrace(int sig)
105 psignal(sig, "perf");
107 printf("-------- backtrace --------\n");
108 size = backtrace(stackdump, ARRAY_SIZE(stackdump));
109 backtrace_symbols_fd(stackdump, size, STDOUT_FILENO);
114 # define ui__signal_backtrace ui__signal
117 static void ui__signal(int sig)
120 psignal(sig, "perf");
130 SLtt_get_screen_size();
132 err = SLsmg_init_smg();
135 err = SLang_init_tty(-1, 0, 0);
141 pr_err("TUI initialization failed.\n");
145 SLkp_define_keysym((char *)"^(kB)", SL_KEY_UNTAB);
147 signal(SIGSEGV, ui__signal_backtrace);
148 signal(SIGFPE, ui__signal_backtrace);
149 signal(SIGINT, ui__signal);
150 signal(SIGQUIT, ui__signal);
151 signal(SIGTERM, ui__signal);
153 perf_error__register(&perf_tui_eops);
157 tui_progress__init();
159 hist_browser__init_hpp();
164 void ui__exit(bool wait_for_ok)
166 if (wait_for_ok && tui_helpline__set)
167 ui__question_window("Fatal Error",
168 ui_helpline__last_msg,
169 "Press any key...", 0);
171 SLtt_set_cursor_visibility(1);
172 if (mutex_trylock(&ui__lock)) {
175 mutex_unlock(&ui__lock);
178 perf_error__unregister(&perf_tui_eops);