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 void 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 90 perf_hpp__init(); 91 break; 92 } 93 } 94 95 void exit_browser(bool wait_for_ok) 96 { 97 switch (use_browser) { 98 case 2: 99 exit_gtk_browser(wait_for_ok); 100 break; 101 102 case 1: 103 ui__exit(wait_for_ok); 104 break; 105 106 default: 107 break; 108 } 109 } 110