diff options
author | Namhyung Kim <namhyung.kim@lge.com> | 2013-12-26 00:37:57 -0500 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2013-12-26 09:22:01 -0500 |
commit | 5c743cf573e6974befe917ed4a36d42b39ef1ce0 (patch) | |
tree | 7609bc7b82ffdbbb94aeeaec228a6eb465e07bad | |
parent | fb7345bbf7fad9bf72ef63a19c707970b9685812 (diff) |
perf ui/tui: Protect windows by ui__lock
Sometimes perf top TUI breaks display with concurrent help/input window
and pr_* messages since they're not protected by ui__lock.
You can check it by pressing (and not releasing) 'h' key on a "perf top
-vvv" TUI session.
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1388036284-32342-2-git-send-email-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
-rw-r--r-- | tools/perf/ui/tui/util.c | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/tools/perf/ui/tui/util.c b/tools/perf/ui/tui/util.c index 092902e30cee..bf890f72fe80 100644 --- a/tools/perf/ui/tui/util.c +++ b/tools/perf/ui/tui/util.c | |||
@@ -92,6 +92,8 @@ int ui_browser__input_window(const char *title, const char *text, char *input, | |||
92 | t = sep + 1; | 92 | t = sep + 1; |
93 | } | 93 | } |
94 | 94 | ||
95 | pthread_mutex_lock(&ui__lock); | ||
96 | |||
95 | max_len += 2; | 97 | max_len += 2; |
96 | nr_lines += 8; | 98 | nr_lines += 8; |
97 | y = SLtt_Screen_Rows / 2 - nr_lines / 2; | 99 | y = SLtt_Screen_Rows / 2 - nr_lines / 2; |
@@ -120,13 +122,19 @@ int ui_browser__input_window(const char *title, const char *text, char *input, | |||
120 | SLsmg_write_nstring((char *)exit_msg, max_len); | 122 | SLsmg_write_nstring((char *)exit_msg, max_len); |
121 | SLsmg_refresh(); | 123 | SLsmg_refresh(); |
122 | 124 | ||
125 | pthread_mutex_unlock(&ui__lock); | ||
126 | |||
123 | x += 2; | 127 | x += 2; |
124 | len = 0; | 128 | len = 0; |
125 | key = ui__getch(delay_secs); | 129 | key = ui__getch(delay_secs); |
126 | while (key != K_TIMER && key != K_ENTER && key != K_ESC) { | 130 | while (key != K_TIMER && key != K_ENTER && key != K_ESC) { |
131 | pthread_mutex_lock(&ui__lock); | ||
132 | |||
127 | if (key == K_BKSPC) { | 133 | if (key == K_BKSPC) { |
128 | if (len == 0) | 134 | if (len == 0) { |
135 | pthread_mutex_unlock(&ui__lock); | ||
129 | goto next_key; | 136 | goto next_key; |
137 | } | ||
130 | SLsmg_gotorc(y, x + --len); | 138 | SLsmg_gotorc(y, x + --len); |
131 | SLsmg_write_char(' '); | 139 | SLsmg_write_char(' '); |
132 | } else { | 140 | } else { |
@@ -136,6 +144,8 @@ int ui_browser__input_window(const char *title, const char *text, char *input, | |||
136 | } | 144 | } |
137 | SLsmg_refresh(); | 145 | SLsmg_refresh(); |
138 | 146 | ||
147 | pthread_mutex_unlock(&ui__lock); | ||
148 | |||
139 | /* XXX more graceful overflow handling needed */ | 149 | /* XXX more graceful overflow handling needed */ |
140 | if (len == sizeof(buf) - 1) { | 150 | if (len == sizeof(buf) - 1) { |
141 | ui_helpline__push("maximum size of symbol name reached!"); | 151 | ui_helpline__push("maximum size of symbol name reached!"); |
@@ -174,6 +184,8 @@ int ui__question_window(const char *title, const char *text, | |||
174 | t = sep + 1; | 184 | t = sep + 1; |
175 | } | 185 | } |
176 | 186 | ||
187 | pthread_mutex_lock(&ui__lock); | ||
188 | |||
177 | max_len += 2; | 189 | max_len += 2; |
178 | nr_lines += 4; | 190 | nr_lines += 4; |
179 | y = SLtt_Screen_Rows / 2 - nr_lines / 2, | 191 | y = SLtt_Screen_Rows / 2 - nr_lines / 2, |
@@ -195,6 +207,9 @@ int ui__question_window(const char *title, const char *text, | |||
195 | SLsmg_gotorc(y + nr_lines - 1, x); | 207 | SLsmg_gotorc(y + nr_lines - 1, x); |
196 | SLsmg_write_nstring((char *)exit_msg, max_len); | 208 | SLsmg_write_nstring((char *)exit_msg, max_len); |
197 | SLsmg_refresh(); | 209 | SLsmg_refresh(); |
210 | |||
211 | pthread_mutex_unlock(&ui__lock); | ||
212 | |||
198 | return ui__getch(delay_secs); | 213 | return ui__getch(delay_secs); |
199 | } | 214 | } |
200 | 215 | ||
@@ -215,9 +230,7 @@ static int __ui__warning(const char *title, const char *format, va_list args) | |||
215 | if (vasprintf(&s, format, args) > 0) { | 230 | if (vasprintf(&s, format, args) > 0) { |
216 | int key; | 231 | int key; |
217 | 232 | ||
218 | pthread_mutex_lock(&ui__lock); | ||
219 | key = ui__question_window(title, s, "Press any key...", 0); | 233 | key = ui__question_window(title, s, "Press any key...", 0); |
220 | pthread_mutex_unlock(&ui__lock); | ||
221 | free(s); | 234 | free(s); |
222 | return key; | 235 | return key; |
223 | } | 236 | } |