diff options
author | Namhyung Kim <namhyung@kernel.org> | 2013-09-13 02:27:43 -0400 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2013-10-09 14:55:25 -0400 |
commit | fc67297b16da335d610af2fac96233d51146300a (patch) | |
tree | f015cca3a70970e48b69b8fbb5c98a75c8911eca /tools/perf/ui | |
parent | fc2be6968e99b5314f20e938a547d44dcb1c40eb (diff) |
perf tools: Separate out GTK codes to libperf-gtk.so
Separate out GTK codes to a shared object called libperf-gtk.so. This
time only GTK codes are built with -fPIC and libperf remains as is. Now
run GTK hist and annotation browser using libdl.
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Reviewed-by: Pekka Enberg <penberg@kernel.org>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung.kim@lge.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Pekka Enberg <penberg@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1379053663-13706-1-git-send-email-namhyung@kernel.org
[ Fix it up wrt Ingo's tools/perf build speedups ]
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf/ui')
-rw-r--r-- | tools/perf/ui/gtk/annotate.c | 13 | ||||
-rw-r--r-- | tools/perf/ui/gtk/gtk.h | 16 | ||||
-rw-r--r-- | tools/perf/ui/setup.c | 61 | ||||
-rw-r--r-- | tools/perf/ui/ui.h | 12 |
4 files changed, 86 insertions, 16 deletions
diff --git a/tools/perf/ui/gtk/annotate.c b/tools/perf/ui/gtk/annotate.c index f538794615db..9c7ff8d31b27 100644 --- a/tools/perf/ui/gtk/annotate.c +++ b/tools/perf/ui/gtk/annotate.c | |||
@@ -154,9 +154,9 @@ static int perf_gtk__annotate_symbol(GtkWidget *window, struct symbol *sym, | |||
154 | return 0; | 154 | return 0; |
155 | } | 155 | } |
156 | 156 | ||
157 | int symbol__gtk_annotate(struct symbol *sym, struct map *map, | 157 | static int symbol__gtk_annotate(struct symbol *sym, struct map *map, |
158 | struct perf_evsel *evsel, | 158 | struct perf_evsel *evsel, |
159 | struct hist_browser_timer *hbt) | 159 | struct hist_browser_timer *hbt) |
160 | { | 160 | { |
161 | GtkWidget *window; | 161 | GtkWidget *window; |
162 | GtkWidget *notebook; | 162 | GtkWidget *notebook; |
@@ -226,6 +226,13 @@ int symbol__gtk_annotate(struct symbol *sym, struct map *map, | |||
226 | return 0; | 226 | return 0; |
227 | } | 227 | } |
228 | 228 | ||
229 | int hist_entry__gtk_annotate(struct hist_entry *he, | ||
230 | struct perf_evsel *evsel, | ||
231 | struct hist_browser_timer *hbt) | ||
232 | { | ||
233 | return symbol__gtk_annotate(he->ms.sym, he->ms.map, evsel, hbt); | ||
234 | } | ||
235 | |||
229 | void perf_gtk__show_annotations(void) | 236 | void perf_gtk__show_annotations(void) |
230 | { | 237 | { |
231 | GtkWidget *window; | 238 | GtkWidget *window; |
diff --git a/tools/perf/ui/gtk/gtk.h b/tools/perf/ui/gtk/gtk.h index a72acbc565e0..8576cf194872 100644 --- a/tools/perf/ui/gtk/gtk.h +++ b/tools/perf/ui/gtk/gtk.h | |||
@@ -20,6 +20,9 @@ struct perf_gtk_context { | |||
20 | guint statbar_ctx_id; | 20 | guint statbar_ctx_id; |
21 | }; | 21 | }; |
22 | 22 | ||
23 | int perf_gtk__init(void); | ||
24 | void perf_gtk__exit(bool wait_for_ok); | ||
25 | |||
23 | extern struct perf_gtk_context *pgctx; | 26 | extern struct perf_gtk_context *pgctx; |
24 | 27 | ||
25 | static inline bool perf_gtk__is_active_context(struct perf_gtk_context *ctx) | 28 | static inline bool perf_gtk__is_active_context(struct perf_gtk_context *ctx) |
@@ -48,4 +51,17 @@ static inline GtkWidget *perf_gtk__setup_info_bar(void) | |||
48 | } | 51 | } |
49 | #endif | 52 | #endif |
50 | 53 | ||
54 | struct perf_evsel; | ||
55 | struct perf_evlist; | ||
56 | struct hist_entry; | ||
57 | struct hist_browser_timer; | ||
58 | |||
59 | int perf_evlist__gtk_browse_hists(struct perf_evlist *evlist, const char *help, | ||
60 | struct hist_browser_timer *hbt, | ||
61 | float min_pcnt); | ||
62 | int hist_entry__gtk_annotate(struct hist_entry *he, | ||
63 | struct perf_evsel *evsel, | ||
64 | struct hist_browser_timer *hbt); | ||
65 | void perf_gtk__show_annotations(void); | ||
66 | |||
51 | #endif /* _PERF_GTK_H_ */ | 67 | #endif /* _PERF_GTK_H_ */ |
diff --git a/tools/perf/ui/setup.c b/tools/perf/ui/setup.c index 47d9a571f261..5df5140a9f29 100644 --- a/tools/perf/ui/setup.c +++ b/tools/perf/ui/setup.c | |||
@@ -1,10 +1,64 @@ | |||
1 | #include <pthread.h> | 1 | #include <pthread.h> |
2 | #include <dlfcn.h> | ||
2 | 3 | ||
3 | #include "../util/cache.h" | 4 | #include "../util/cache.h" |
4 | #include "../util/debug.h" | 5 | #include "../util/debug.h" |
5 | #include "../util/hist.h" | 6 | #include "../util/hist.h" |
6 | 7 | ||
7 | pthread_mutex_t ui__lock = PTHREAD_MUTEX_INITIALIZER; | 8 | pthread_mutex_t ui__lock = PTHREAD_MUTEX_INITIALIZER; |
9 | void *perf_gtk_handle; | ||
10 | |||
11 | #ifdef HAVE_GTK2_SUPPORT | ||
12 | static int setup_gtk_browser(void) | ||
13 | { | ||
14 | int (*perf_ui_init)(void); | ||
15 | |||
16 | if (perf_gtk_handle) | ||
17 | return 0; | ||
18 | |||
19 | perf_gtk_handle = dlopen(PERF_GTK_DSO, RTLD_LAZY); | ||
20 | if (perf_gtk_handle == NULL) { | ||
21 | char buf[PATH_MAX]; | ||
22 | scnprintf(buf, sizeof(buf), "%s/%s", LIBDIR, PERF_GTK_DSO); | ||
23 | perf_gtk_handle = dlopen(buf, RTLD_LAZY); | ||
24 | } | ||
25 | if (perf_gtk_handle == NULL) | ||
26 | return -1; | ||
27 | |||
28 | perf_ui_init = dlsym(perf_gtk_handle, "perf_gtk__init"); | ||
29 | if (perf_ui_init == NULL) | ||
30 | goto out_close; | ||
31 | |||
32 | if (perf_ui_init() == 0) | ||
33 | return 0; | ||
34 | |||
35 | out_close: | ||
36 | dlclose(perf_gtk_handle); | ||
37 | return -1; | ||
38 | } | ||
39 | |||
40 | static void exit_gtk_browser(bool wait_for_ok) | ||
41 | { | ||
42 | void (*perf_ui_exit)(bool); | ||
43 | |||
44 | if (perf_gtk_handle == NULL) | ||
45 | return; | ||
46 | |||
47 | perf_ui_exit = dlsym(perf_gtk_handle, "perf_gtk__exit"); | ||
48 | if (perf_ui_exit == NULL) | ||
49 | goto out_close; | ||
50 | |||
51 | perf_ui_exit(wait_for_ok); | ||
52 | |||
53 | out_close: | ||
54 | dlclose(perf_gtk_handle); | ||
55 | |||
56 | perf_gtk_handle = NULL; | ||
57 | } | ||
58 | #else | ||
59 | static inline int setup_gtk_browser(void) { return -1; } | ||
60 | static inline void exit_gtk_browser(bool wait_for_ok __maybe_unused) {} | ||
61 | #endif | ||
8 | 62 | ||
9 | void setup_browser(bool fallback_to_pager) | 63 | void setup_browser(bool fallback_to_pager) |
10 | { | 64 | { |
@@ -17,8 +71,11 @@ void setup_browser(bool fallback_to_pager) | |||
17 | 71 | ||
18 | switch (use_browser) { | 72 | switch (use_browser) { |
19 | case 2: | 73 | case 2: |
20 | if (perf_gtk__init() == 0) | 74 | if (setup_gtk_browser() == 0) |
21 | break; | 75 | break; |
76 | printf("GTK browser requested but could not find %s\n", | ||
77 | PERF_GTK_DSO); | ||
78 | sleep(1); | ||
22 | /* fall through */ | 79 | /* fall through */ |
23 | case 1: | 80 | case 1: |
24 | use_browser = 1; | 81 | use_browser = 1; |
@@ -39,7 +96,7 @@ void exit_browser(bool wait_for_ok) | |||
39 | { | 96 | { |
40 | switch (use_browser) { | 97 | switch (use_browser) { |
41 | case 2: | 98 | case 2: |
42 | perf_gtk__exit(wait_for_ok); | 99 | exit_gtk_browser(wait_for_ok); |
43 | break; | 100 | break; |
44 | 101 | ||
45 | case 1: | 102 | case 1: |
diff --git a/tools/perf/ui/ui.h b/tools/perf/ui/ui.h index 1349d142a005..ab88383f8be8 100644 --- a/tools/perf/ui/ui.h +++ b/tools/perf/ui/ui.h | |||
@@ -6,6 +6,7 @@ | |||
6 | #include <linux/compiler.h> | 6 | #include <linux/compiler.h> |
7 | 7 | ||
8 | extern pthread_mutex_t ui__lock; | 8 | extern pthread_mutex_t ui__lock; |
9 | extern void *perf_gtk_handle; | ||
9 | 10 | ||
10 | extern int use_browser; | 11 | extern int use_browser; |
11 | 12 | ||
@@ -23,17 +24,6 @@ static inline int ui__init(void) | |||
23 | static inline void ui__exit(bool wait_for_ok __maybe_unused) {} | 24 | static inline void ui__exit(bool wait_for_ok __maybe_unused) {} |
24 | #endif | 25 | #endif |
25 | 26 | ||
26 | #ifdef HAVE_GTK2_SUPPORT | ||
27 | int perf_gtk__init(void); | ||
28 | void perf_gtk__exit(bool wait_for_ok); | ||
29 | #else | ||
30 | static inline int perf_gtk__init(void) | ||
31 | { | ||
32 | return -1; | ||
33 | } | ||
34 | static inline void perf_gtk__exit(bool wait_for_ok __maybe_unused) {} | ||
35 | #endif | ||
36 | |||
37 | void ui__refresh_dimensions(bool force); | 27 | void ui__refresh_dimensions(bool force); |
38 | 28 | ||
39 | #endif /* _PERF_UI_H_ */ | 29 | #endif /* _PERF_UI_H_ */ |