diff options
author | Arnaldo Carvalho de Melo <acme@redhat.com> | 2011-10-25 11:45:16 -0400 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2011-10-26 11:05:23 -0400 |
commit | 71172ed97cd4cd45c6ae70e594ba351798d11909 (patch) | |
tree | c94ffc88b9ebf64b71531adf6c0028dcc24b9217 /tools | |
parent | ca59bcbceeb7fd412faa35871ec0bd21bdd69229 (diff) |
perf ui: Improve handling sigwinch a bit
No need to unblock it at each ui__getch() and also allow other users to
check if a resize is needed, or force an refresh of terminal dimensions.
The 'force' one shouldn't be needed, but its in a slow path, so leave it
like that for now, I'll revisit this another day.
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-aujchu6yx3bfy64non1rky0w@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools')
-rw-r--r-- | tools/perf/util/ui/browser.c | 49 | ||||
-rw-r--r-- | tools/perf/util/ui/progress.c | 1 | ||||
-rw-r--r-- | tools/perf/util/ui/setup.c | 75 | ||||
-rw-r--r-- | tools/perf/util/ui/ui.h | 3 | ||||
-rw-r--r-- | tools/perf/util/ui/util.h | 1 |
5 files changed, 82 insertions, 47 deletions
diff --git a/tools/perf/util/ui/browser.c b/tools/perf/util/ui/browser.c index 5359f371d30a..370c4703cec8 100644 --- a/tools/perf/util/ui/browser.c +++ b/tools/perf/util/ui/browser.c | |||
@@ -4,6 +4,7 @@ | |||
4 | #include "libslang.h" | 4 | #include "libslang.h" |
5 | #include <newt.h> | 5 | #include <newt.h> |
6 | #include "ui.h" | 6 | #include "ui.h" |
7 | #include "util.h" | ||
7 | #include <linux/compiler.h> | 8 | #include <linux/compiler.h> |
8 | #include <linux/list.h> | 9 | #include <linux/list.h> |
9 | #include <linux/rbtree.h> | 10 | #include <linux/rbtree.h> |
@@ -291,53 +292,10 @@ void ui_browser__update_nr_entries(struct ui_browser *browser, u32 nr_entries) | |||
291 | browser->seek(browser, browser->top_idx, SEEK_SET); | 292 | browser->seek(browser, browser->top_idx, SEEK_SET); |
292 | } | 293 | } |
293 | 294 | ||
294 | static int ui__getch(int delay_secs) | ||
295 | { | ||
296 | struct timeval timeout, *ptimeout = delay_secs ? &timeout : NULL; | ||
297 | fd_set read_set; | ||
298 | int err, key; | ||
299 | |||
300 | FD_ZERO(&read_set); | ||
301 | FD_SET(0, &read_set); | ||
302 | |||
303 | if (delay_secs) { | ||
304 | timeout.tv_sec = delay_secs; | ||
305 | timeout.tv_usec = 0; | ||
306 | } | ||
307 | |||
308 | err = select(1, &read_set, NULL, NULL, ptimeout); | ||
309 | |||
310 | if (err == 0) | ||
311 | return K_TIMER; | ||
312 | |||
313 | if (err == -1) { | ||
314 | if (errno == EINTR) | ||
315 | return K_RESIZE; | ||
316 | return K_ERROR; | ||
317 | } | ||
318 | |||
319 | key = SLang_getkey(); | ||
320 | if (key != K_ESC) | ||
321 | return key; | ||
322 | |||
323 | FD_ZERO(&read_set); | ||
324 | FD_SET(0, &read_set); | ||
325 | timeout.tv_sec = 0; | ||
326 | timeout.tv_usec = 20; | ||
327 | err = select(1, &read_set, NULL, NULL, &timeout); | ||
328 | if (err == 0) | ||
329 | return K_ESC; | ||
330 | |||
331 | SLang_ungetkey(key); | ||
332 | return SLkp_getkey(); | ||
333 | } | ||
334 | |||
335 | int ui_browser__run(struct ui_browser *self, int delay_secs) | 295 | int ui_browser__run(struct ui_browser *self, int delay_secs) |
336 | { | 296 | { |
337 | int err, key; | 297 | int err, key; |
338 | 298 | ||
339 | pthread__unblock_sigwinch(); | ||
340 | |||
341 | while (1) { | 299 | while (1) { |
342 | off_t offset; | 300 | off_t offset; |
343 | 301 | ||
@@ -351,10 +309,7 @@ int ui_browser__run(struct ui_browser *self, int delay_secs) | |||
351 | key = ui__getch(delay_secs); | 309 | key = ui__getch(delay_secs); |
352 | 310 | ||
353 | if (key == K_RESIZE) { | 311 | if (key == K_RESIZE) { |
354 | pthread_mutex_lock(&ui__lock); | 312 | ui__refresh_dimensions(false); |
355 | SLtt_get_screen_size(); | ||
356 | SLsmg_reinit_smg(); | ||
357 | pthread_mutex_unlock(&ui__lock); | ||
358 | ui_browser__refresh_dimensions(self); | 313 | ui_browser__refresh_dimensions(self); |
359 | __ui_browser__show_title(self, self->title); | 314 | __ui_browser__show_title(self, self->title); |
360 | ui_helpline__puts(self->helpline); | 315 | ui_helpline__puts(self->helpline); |
diff --git a/tools/perf/util/ui/progress.c b/tools/perf/util/ui/progress.c index 68d2c548abe3..295e366b6311 100644 --- a/tools/perf/util/ui/progress.c +++ b/tools/perf/util/ui/progress.c | |||
@@ -14,6 +14,7 @@ void ui_progress__update(u64 curr, u64 total, const char *title) | |||
14 | if (use_browser <= 0) | 14 | if (use_browser <= 0) |
15 | return; | 15 | return; |
16 | 16 | ||
17 | ui__refresh_dimensions(true); | ||
17 | pthread_mutex_lock(&ui__lock); | 18 | pthread_mutex_lock(&ui__lock); |
18 | y = SLtt_Screen_Rows / 2 - 2; | 19 | y = SLtt_Screen_Rows / 2 - 2; |
19 | SLsmg_set_color(0); | 20 | SLsmg_set_color(0); |
diff --git a/tools/perf/util/ui/setup.c b/tools/perf/util/ui/setup.c index 1e6ba06980c4..c4e025fbd6b9 100644 --- a/tools/perf/util/ui/setup.c +++ b/tools/perf/util/ui/setup.c | |||
@@ -7,10 +7,85 @@ | |||
7 | #include "browser.h" | 7 | #include "browser.h" |
8 | #include "helpline.h" | 8 | #include "helpline.h" |
9 | #include "ui.h" | 9 | #include "ui.h" |
10 | #include "util.h" | ||
10 | #include "libslang.h" | 11 | #include "libslang.h" |
12 | #include "keysyms.h" | ||
11 | 13 | ||
12 | pthread_mutex_t ui__lock = PTHREAD_MUTEX_INITIALIZER; | 14 | pthread_mutex_t ui__lock = PTHREAD_MUTEX_INITIALIZER; |
13 | 15 | ||
16 | static volatile int ui__need_resize; | ||
17 | |||
18 | void ui__refresh_dimensions(bool force) | ||
19 | { | ||
20 | if (force || ui__need_resize) { | ||
21 | ui__need_resize = 0; | ||
22 | pthread_mutex_lock(&ui__lock); | ||
23 | SLtt_get_screen_size(); | ||
24 | SLsmg_reinit_smg(); | ||
25 | pthread_mutex_unlock(&ui__lock); | ||
26 | } | ||
27 | } | ||
28 | |||
29 | static void ui__sigwinch(int sig __used) | ||
30 | { | ||
31 | ui__need_resize = 1; | ||
32 | } | ||
33 | |||
34 | static void ui__setup_sigwinch(void) | ||
35 | { | ||
36 | static bool done; | ||
37 | |||
38 | if (done) | ||
39 | return; | ||
40 | |||
41 | done = true; | ||
42 | pthread__unblock_sigwinch(); | ||
43 | signal(SIGWINCH, ui__sigwinch); | ||
44 | } | ||
45 | |||
46 | int ui__getch(int delay_secs) | ||
47 | { | ||
48 | struct timeval timeout, *ptimeout = delay_secs ? &timeout : NULL; | ||
49 | fd_set read_set; | ||
50 | int err, key; | ||
51 | |||
52 | ui__setup_sigwinch(); | ||
53 | |||
54 | FD_ZERO(&read_set); | ||
55 | FD_SET(0, &read_set); | ||
56 | |||
57 | if (delay_secs) { | ||
58 | timeout.tv_sec = delay_secs; | ||
59 | timeout.tv_usec = 0; | ||
60 | } | ||
61 | |||
62 | err = select(1, &read_set, NULL, NULL, ptimeout); | ||
63 | |||
64 | if (err == 0) | ||
65 | return K_TIMER; | ||
66 | |||
67 | if (err == -1) { | ||
68 | if (errno == EINTR) | ||
69 | return K_RESIZE; | ||
70 | return K_ERROR; | ||
71 | } | ||
72 | |||
73 | key = SLang_getkey(); | ||
74 | if (key != K_ESC) | ||
75 | return key; | ||
76 | |||
77 | FD_ZERO(&read_set); | ||
78 | FD_SET(0, &read_set); | ||
79 | timeout.tv_sec = 0; | ||
80 | timeout.tv_usec = 20; | ||
81 | err = select(1, &read_set, NULL, NULL, &timeout); | ||
82 | if (err == 0) | ||
83 | return K_ESC; | ||
84 | |||
85 | SLang_ungetkey(key); | ||
86 | return SLkp_getkey(); | ||
87 | } | ||
88 | |||
14 | static void newt_suspend(void *d __used) | 89 | static void newt_suspend(void *d __used) |
15 | { | 90 | { |
16 | newtSuspend(); | 91 | newtSuspend(); |
diff --git a/tools/perf/util/ui/ui.h b/tools/perf/util/ui/ui.h index d264e059c829..7b67045479f6 100644 --- a/tools/perf/util/ui/ui.h +++ b/tools/perf/util/ui/ui.h | |||
@@ -2,7 +2,10 @@ | |||
2 | #define _PERF_UI_H_ 1 | 2 | #define _PERF_UI_H_ 1 |
3 | 3 | ||
4 | #include <pthread.h> | 4 | #include <pthread.h> |
5 | #include <stdbool.h> | ||
5 | 6 | ||
6 | extern pthread_mutex_t ui__lock; | 7 | extern pthread_mutex_t ui__lock; |
7 | 8 | ||
9 | void ui__refresh_dimensions(bool force); | ||
10 | |||
8 | #endif /* _PERF_UI_H_ */ | 11 | #endif /* _PERF_UI_H_ */ |
diff --git a/tools/perf/util/ui/util.h b/tools/perf/util/ui/util.h index afcbc1d99531..e53c3d334903 100644 --- a/tools/perf/util/ui/util.h +++ b/tools/perf/util/ui/util.h | |||
@@ -3,6 +3,7 @@ | |||
3 | 3 | ||
4 | #include <stdbool.h> | 4 | #include <stdbool.h> |
5 | 5 | ||
6 | int ui__getch(int delay_secs); | ||
6 | int ui__popup_menu(int argc, char * const argv[]); | 7 | int ui__popup_menu(int argc, char * const argv[]); |
7 | int ui__help_window(const char *text); | 8 | int ui__help_window(const char *text); |
8 | bool ui__dialog_yesno(const char *msg); | 9 | bool ui__dialog_yesno(const char *msg); |