diff options
author | Namhyung Kim <namhyung@kernel.org> | 2012-08-16 04:14:50 -0400 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2012-08-16 13:17:01 -0400 |
commit | e6e9046879493d8bf8f44ac1f2718c4a5628aa52 (patch) | |
tree | d625ac31d84bd77e9678e887729eac574ac9b773 /tools/perf/ui | |
parent | c883122acc0d97648d8b8f4726709017674e4420 (diff) |
perf ui: Introduce struct ui_helpline
Add struct ui_helpline in order to provide flexible implementation of
helpline APIs. And convert existing TUI implementation to use it.
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1345104894-14205-1-git-send-email-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf/ui')
-rw-r--r-- | tools/perf/ui/helpline.c | 56 | ||||
-rw-r--r-- | tools/perf/ui/helpline.h | 10 | ||||
-rw-r--r-- | tools/perf/ui/tui/helpline.c | 57 |
3 files changed, 85 insertions, 38 deletions
diff --git a/tools/perf/ui/helpline.c b/tools/perf/ui/helpline.c index 2f950c2641c..78ba28ac7a2 100644 --- a/tools/perf/ui/helpline.c +++ b/tools/perf/ui/helpline.c | |||
@@ -5,23 +5,32 @@ | |||
5 | #include "../debug.h" | 5 | #include "../debug.h" |
6 | #include "helpline.h" | 6 | #include "helpline.h" |
7 | #include "ui.h" | 7 | #include "ui.h" |
8 | #include "libslang.h" | ||
9 | 8 | ||
10 | void ui_helpline__pop(void) | 9 | char ui_helpline__current[512]; |
10 | |||
11 | static void nop_helpline__pop(void) | ||
11 | { | 12 | { |
12 | } | 13 | } |
13 | 14 | ||
14 | char ui_helpline__current[512]; | 15 | static void nop_helpline__push(const char *msg __used) |
16 | { | ||
17 | } | ||
15 | 18 | ||
16 | void ui_helpline__push(const char *msg) | 19 | static struct ui_helpline default_helpline_fns = { |
20 | .pop = nop_helpline__pop, | ||
21 | .push = nop_helpline__push, | ||
22 | }; | ||
23 | |||
24 | struct ui_helpline *helpline_fns = &default_helpline_fns; | ||
25 | |||
26 | void ui_helpline__pop(void) | ||
17 | { | 27 | { |
18 | const size_t sz = sizeof(ui_helpline__current); | 28 | helpline_fns->pop(); |
29 | } | ||
19 | 30 | ||
20 | SLsmg_gotorc(SLtt_Screen_Rows - 1, 0); | 31 | void ui_helpline__push(const char *msg) |
21 | SLsmg_set_color(0); | 32 | { |
22 | SLsmg_write_nstring((char *)msg, SLtt_Screen_Cols); | 33 | helpline_fns->push(msg); |
23 | SLsmg_refresh(); | ||
24 | strncpy(ui_helpline__current, msg, sz)[sz - 1] = '\0'; | ||
25 | } | 34 | } |
26 | 35 | ||
27 | void ui_helpline__vpush(const char *fmt, va_list ap) | 36 | void ui_helpline__vpush(const char *fmt, va_list ap) |
@@ -50,30 +59,3 @@ void ui_helpline__puts(const char *msg) | |||
50 | ui_helpline__pop(); | 59 | ui_helpline__pop(); |
51 | ui_helpline__push(msg); | 60 | ui_helpline__push(msg); |
52 | } | 61 | } |
53 | |||
54 | void ui_helpline__init(void) | ||
55 | { | ||
56 | ui_helpline__puts(" "); | ||
57 | } | ||
58 | |||
59 | char ui_helpline__last_msg[1024]; | ||
60 | |||
61 | int ui_helpline__show_help(const char *format, va_list ap) | ||
62 | { | ||
63 | int ret; | ||
64 | static int backlog; | ||
65 | |||
66 | pthread_mutex_lock(&ui__lock); | ||
67 | ret = vscnprintf(ui_helpline__last_msg + backlog, | ||
68 | sizeof(ui_helpline__last_msg) - backlog, format, ap); | ||
69 | backlog += ret; | ||
70 | |||
71 | if (ui_helpline__last_msg[backlog - 1] == '\n') { | ||
72 | ui_helpline__puts(ui_helpline__last_msg); | ||
73 | SLsmg_refresh(); | ||
74 | backlog = 0; | ||
75 | } | ||
76 | pthread_mutex_unlock(&ui__lock); | ||
77 | |||
78 | return ret; | ||
79 | } | ||
diff --git a/tools/perf/ui/helpline.h b/tools/perf/ui/helpline.h index 7bab6b34e35..61118b2bc24 100644 --- a/tools/perf/ui/helpline.h +++ b/tools/perf/ui/helpline.h | |||
@@ -4,13 +4,21 @@ | |||
4 | #include <stdio.h> | 4 | #include <stdio.h> |
5 | #include <stdarg.h> | 5 | #include <stdarg.h> |
6 | 6 | ||
7 | struct ui_helpline { | ||
8 | void (*pop)(void); | ||
9 | void (*push)(const char *msg); | ||
10 | }; | ||
11 | |||
12 | extern struct ui_helpline *helpline_fns; | ||
13 | |||
7 | void ui_helpline__init(void); | 14 | void ui_helpline__init(void); |
15 | |||
8 | void ui_helpline__pop(void); | 16 | void ui_helpline__pop(void); |
9 | void ui_helpline__push(const char *msg); | 17 | void ui_helpline__push(const char *msg); |
10 | void ui_helpline__vpush(const char *fmt, va_list ap); | 18 | void ui_helpline__vpush(const char *fmt, va_list ap); |
11 | void ui_helpline__fpush(const char *fmt, ...); | 19 | void ui_helpline__fpush(const char *fmt, ...); |
12 | void ui_helpline__puts(const char *msg); | 20 | void ui_helpline__puts(const char *msg); |
13 | 21 | ||
14 | extern char ui_helpline__current[]; | 22 | extern char ui_helpline__current[512]; |
15 | 23 | ||
16 | #endif /* _PERF_UI_HELPLINE_H_ */ | 24 | #endif /* _PERF_UI_HELPLINE_H_ */ |
diff --git a/tools/perf/ui/tui/helpline.c b/tools/perf/ui/tui/helpline.c new file mode 100644 index 00000000000..2884d2f41e3 --- /dev/null +++ b/tools/perf/ui/tui/helpline.c | |||
@@ -0,0 +1,57 @@ | |||
1 | #include <stdio.h> | ||
2 | #include <stdlib.h> | ||
3 | #include <string.h> | ||
4 | #include <pthread.h> | ||
5 | |||
6 | #include "../../util/debug.h" | ||
7 | #include "../helpline.h" | ||
8 | #include "../ui.h" | ||
9 | #include "../libslang.h" | ||
10 | |||
11 | static void tui_helpline__pop(void) | ||
12 | { | ||
13 | } | ||
14 | |||
15 | static void tui_helpline__push(const char *msg) | ||
16 | { | ||
17 | const size_t sz = sizeof(ui_helpline__current); | ||
18 | |||
19 | SLsmg_gotorc(SLtt_Screen_Rows - 1, 0); | ||
20 | SLsmg_set_color(0); | ||
21 | SLsmg_write_nstring((char *)msg, SLtt_Screen_Cols); | ||
22 | SLsmg_refresh(); | ||
23 | strncpy(ui_helpline__current, msg, sz)[sz - 1] = '\0'; | ||
24 | } | ||
25 | |||
26 | struct ui_helpline tui_helpline_fns = { | ||
27 | .pop = tui_helpline__pop, | ||
28 | .push = tui_helpline__push, | ||
29 | }; | ||
30 | |||
31 | void ui_helpline__init(void) | ||
32 | { | ||
33 | helpline_fns = &tui_helpline_fns; | ||
34 | ui_helpline__puts(" "); | ||
35 | } | ||
36 | |||
37 | char ui_helpline__last_msg[1024]; | ||
38 | |||
39 | int ui_helpline__show_help(const char *format, va_list ap) | ||
40 | { | ||
41 | int ret; | ||
42 | static int backlog; | ||
43 | |||
44 | pthread_mutex_lock(&ui__lock); | ||
45 | ret = vscnprintf(ui_helpline__last_msg + backlog, | ||
46 | sizeof(ui_helpline__last_msg) - backlog, format, ap); | ||
47 | backlog += ret; | ||
48 | |||
49 | if (ui_helpline__last_msg[backlog - 1] == '\n') { | ||
50 | ui_helpline__puts(ui_helpline__last_msg); | ||
51 | SLsmg_refresh(); | ||
52 | backlog = 0; | ||
53 | } | ||
54 | pthread_mutex_unlock(&ui__lock); | ||
55 | |||
56 | return ret; | ||
57 | } | ||