xref: /linux/tools/perf/ui/setup.c (revision 7181e5590e5ba898804aef3ee6be7f27606e6f8b)
1 #include <pthread.h>
2 #include <dlfcn.h>
3 
4 #include "../util/cache.h"
5 #include "../util/debug.h"
6 #include "../util/hist.h"
7 
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
62 
63 int stdio__config_color(const struct option *opt __maybe_unused,
64 			const char *mode, int unset __maybe_unused)
65 {
66 	perf_use_color_default = perf_config_colorbool("color.ui", mode, -1);
67 	return 0;
68 }
69 
70 void setup_browser(bool fallback_to_pager)
71 {
72 	if (use_browser < 2 && (!isatty(1) || dump_trace))
73 		use_browser = 0;
74 
75 	/* default to TUI */
76 	if (use_browser < 0)
77 		use_browser = 1;
78 
79 	switch (use_browser) {
80 	case 2:
81 		if (setup_gtk_browser() == 0)
82 			break;
83 		printf("GTK browser requested but could not find %s\n",
84 		       PERF_GTK_DSO);
85 		sleep(1);
86 		/* fall through */
87 	case 1:
88 		use_browser = 1;
89 		if (ui__init() == 0)
90 			break;
91 		/* fall through */
92 	default:
93 		use_browser = 0;
94 		if (fallback_to_pager)
95 			setup_pager();
96 		break;
97 	}
98 }
99 
100 void exit_browser(bool wait_for_ok)
101 {
102 	switch (use_browser) {
103 	case 2:
104 		exit_gtk_browser(wait_for_ok);
105 		break;
106 
107 	case 1:
108 		ui__exit(wait_for_ok);
109 		break;
110 
111 	default:
112 		break;
113 	}
114 }
115