xref: /openbmc/linux/tools/perf/ui/setup.c (revision e5c86679)
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 int use_browser = -1;
11 
12 #ifdef HAVE_GTK2_SUPPORT
13 static int setup_gtk_browser(void)
14 {
15 	int (*perf_ui_init)(void);
16 
17 	if (perf_gtk_handle)
18 		return 0;
19 
20 	perf_gtk_handle = dlopen(PERF_GTK_DSO, RTLD_LAZY);
21 	if (perf_gtk_handle == NULL) {
22 		char buf[PATH_MAX];
23 		scnprintf(buf, sizeof(buf), "%s/%s", LIBDIR, PERF_GTK_DSO);
24 		perf_gtk_handle = dlopen(buf, RTLD_LAZY);
25 	}
26 	if (perf_gtk_handle == NULL)
27 		return -1;
28 
29 	perf_ui_init = dlsym(perf_gtk_handle, "perf_gtk__init");
30 	if (perf_ui_init == NULL)
31 		goto out_close;
32 
33 	if (perf_ui_init() == 0)
34 		return 0;
35 
36 out_close:
37 	dlclose(perf_gtk_handle);
38 	return -1;
39 }
40 
41 static void exit_gtk_browser(bool wait_for_ok)
42 {
43 	void (*perf_ui_exit)(bool);
44 
45 	if (perf_gtk_handle == NULL)
46 		return;
47 
48 	perf_ui_exit = dlsym(perf_gtk_handle, "perf_gtk__exit");
49 	if (perf_ui_exit == NULL)
50 		goto out_close;
51 
52 	perf_ui_exit(wait_for_ok);
53 
54 out_close:
55 	dlclose(perf_gtk_handle);
56 
57 	perf_gtk_handle = NULL;
58 }
59 #else
60 static inline int setup_gtk_browser(void) { return -1; }
61 static inline void exit_gtk_browser(bool wait_for_ok __maybe_unused) {}
62 #endif
63 
64 int stdio__config_color(const struct option *opt __maybe_unused,
65 			const char *mode, int unset __maybe_unused)
66 {
67 	perf_use_color_default = perf_config_colorbool("color.ui", mode, -1);
68 	return 0;
69 }
70 
71 void setup_browser(bool fallback_to_pager)
72 {
73 	if (use_browser < 2 && (!isatty(1) || dump_trace))
74 		use_browser = 0;
75 
76 	/* default to TUI */
77 	if (use_browser < 0)
78 		use_browser = 1;
79 
80 	switch (use_browser) {
81 	case 2:
82 		if (setup_gtk_browser() == 0)
83 			break;
84 		printf("GTK browser requested but could not find %s\n",
85 		       PERF_GTK_DSO);
86 		sleep(1);
87 		/* fall through */
88 	case 1:
89 		use_browser = 1;
90 		if (ui__init() == 0)
91 			break;
92 		/* fall through */
93 	default:
94 		use_browser = 0;
95 		if (fallback_to_pager)
96 			setup_pager();
97 		break;
98 	}
99 }
100 
101 void exit_browser(bool wait_for_ok)
102 {
103 	switch (use_browser) {
104 	case 2:
105 		exit_gtk_browser(wait_for_ok);
106 		break;
107 
108 	case 1:
109 		ui__exit(wait_for_ok);
110 		break;
111 
112 	default:
113 		break;
114 	}
115 }
116