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