Linux Perf
setup.c
Go to the documentation of this file.
1 // SPDX-License-Identifier: GPL-2.0
2 #include <pthread.h>
3 #include <dlfcn.h>
4 
5 #include "../util/cache.h"
6 #include "../util/debug.h"
7 #include "../util/hist.h"
8 #include "../util/util.h"
9 
10 pthread_mutex_t ui__lock = PTHREAD_MUTEX_INITIALIZER;
12 int use_browser = -1;
13 
14 #define PERF_GTK_DSO "libperf-gtk.so"
15 
16 #ifdef HAVE_GTK2_SUPPORT
17 
18 static int setup_gtk_browser(void)
19 {
20  int (*perf_ui_init)(void);
21 
22  if (perf_gtk_handle)
23  return 0;
24 
25  perf_gtk_handle = dlopen(PERF_GTK_DSO, RTLD_LAZY);
26  if (perf_gtk_handle == NULL) {
27  char buf[PATH_MAX];
28  scnprintf(buf, sizeof(buf), "%s/%s", LIBDIR, PERF_GTK_DSO);
29  perf_gtk_handle = dlopen(buf, RTLD_LAZY);
30  }
31  if (perf_gtk_handle == NULL)
32  return -1;
33 
34  perf_ui_init = dlsym(perf_gtk_handle, "perf_gtk__init");
35  if (perf_ui_init == NULL)
36  goto out_close;
37 
38  if (perf_ui_init() == 0)
39  return 0;
40 
41 out_close:
42  dlclose(perf_gtk_handle);
43  return -1;
44 }
45 
46 static void exit_gtk_browser(bool wait_for_ok)
47 {
48  void (*perf_ui_exit)(bool);
49 
50  if (perf_gtk_handle == NULL)
51  return;
52 
53  perf_ui_exit = dlsym(perf_gtk_handle, "perf_gtk__exit");
54  if (perf_ui_exit == NULL)
55  goto out_close;
56 
57  perf_ui_exit(wait_for_ok);
58 
59 out_close:
60  dlclose(perf_gtk_handle);
61 
62  perf_gtk_handle = NULL;
63 }
64 #else
65 static inline int setup_gtk_browser(void) { return -1; }
66 static inline void exit_gtk_browser(bool wait_for_ok __maybe_unused) {}
67 #endif
68 
69 int stdio__config_color(const struct option *opt __maybe_unused,
70  const char *mode, int unset __maybe_unused)
71 {
72  perf_use_color_default = perf_config_colorbool("color.ui", mode, -1);
73  return 0;
74 }
75 
76 void setup_browser(bool fallback_to_pager)
77 {
78  if (use_browser < 2 && (!isatty(1) || dump_trace))
79  use_browser = 0;
80 
81  /* default to TUI */
82  if (use_browser < 0)
83  use_browser = 1;
84 
85  switch (use_browser) {
86  case 2:
87  if (setup_gtk_browser() == 0)
88  break;
89  printf("GTK browser requested but could not find %s\n",
90  PERF_GTK_DSO);
91  sleep(1);
92  /* fall through */
93  case 1:
94  use_browser = 1;
95  if (ui__init() == 0)
96  break;
97  /* fall through */
98  default:
99  use_browser = 0;
100  if (fallback_to_pager)
101  setup_pager();
102  break;
103  }
104 }
105 
106 void exit_browser(bool wait_for_ok)
107 {
108  switch (use_browser) {
109  case 2:
110  exit_gtk_browser(wait_for_ok);
111  break;
112 
113  case 1:
114  ui__exit(wait_for_ok);
115  break;
116 
117  default:
118  break;
119  }
120 }
int stdio__config_color(const struct option *opt __maybe_unused, const char *mode, int unset __maybe_unused)
Definition: setup.c:69
void * perf_gtk_handle
Definition: setup.c:11
int perf_config_colorbool(const char *var, const char *value, int stdout_is_tty)
Definition: color.c:13
pthread_mutex_t ui__lock
Definition: setup.c:10
int use_browser
Definition: setup.c:12
void setup_browser(bool fallback_to_pager)
Definition: setup.c:76
static void exit_gtk_browser(bool wait_for_ok __maybe_unused)
Definition: setup.c:66
#define PATH_MAX
Definition: jevents.c:1042
void exit_browser(bool wait_for_ok)
Definition: setup.c:106
#define PERF_GTK_DSO
Definition: setup.c:14
void ui__exit(bool wait_for_ok)
Definition: setup.c:165
int ui__init(void)
Definition: setup.c:125
bool dump_trace
Definition: debug.c:27
static int setup_gtk_browser(void)
Definition: setup.c:65
int perf_use_color_default
Definition: color.c:11