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
8pthread_mutex_t ui__lock = PTHREAD_MUTEX_INITIALIZER;
9void *perf_gtk_handle;
10
11#ifdef HAVE_GTK2_SUPPORT
12static 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
35out_close:
36	dlclose(perf_gtk_handle);
37	return -1;
38}
39
40static 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
53out_close:
54	dlclose(perf_gtk_handle);
55
56	perf_gtk_handle = NULL;
57}
58#else
59static inline int setup_gtk_browser(void) { return -1; }
60static inline void exit_gtk_browser(bool wait_for_ok __maybe_unused) {}
61#endif
62
63void setup_browser(bool fallback_to_pager)
64{
65	if (use_browser < 2 && (!isatty(1) || dump_trace))
66		use_browser = 0;
67
68	/* default to TUI */
69	if (use_browser < 0)
70		use_browser = 1;
71
72	switch (use_browser) {
73	case 2:
74		if (setup_gtk_browser() == 0)
75			break;
76		printf("GTK browser requested but could not find %s\n",
77		       PERF_GTK_DSO);
78		sleep(1);
79		/* fall through */
80	case 1:
81		use_browser = 1;
82		if (ui__init() == 0)
83			break;
84		/* fall through */
85	default:
86		use_browser = 0;
87		if (fallback_to_pager)
88			setup_pager();
89		break;
90	}
91}
92
93void exit_browser(bool wait_for_ok)
94{
95	switch (use_browser) {
96	case 2:
97		exit_gtk_browser(wait_for_ok);
98		break;
99
100	case 1:
101		ui__exit(wait_for_ok);
102		break;
103
104	default:
105		break;
106	}
107}
108