Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 #include <pthread.h>
0003 #include <dlfcn.h>
0004 #include <unistd.h>
0005 
0006 #include <subcmd/pager.h>
0007 #include "../util/debug.h"
0008 #include "../util/hist.h"
0009 #include "ui.h"
0010 
0011 pthread_mutex_t ui__lock = PTHREAD_MUTEX_INITIALIZER;
0012 void *perf_gtk_handle;
0013 int use_browser = -1;
0014 
0015 #define PERF_GTK_DSO "libperf-gtk.so"
0016 
0017 #ifdef HAVE_GTK2_SUPPORT
0018 
0019 static int setup_gtk_browser(void)
0020 {
0021     int (*perf_ui_init)(void);
0022 
0023     if (perf_gtk_handle)
0024         return 0;
0025 
0026     perf_gtk_handle = dlopen(PERF_GTK_DSO, RTLD_LAZY);
0027     if (perf_gtk_handle == NULL) {
0028         char buf[PATH_MAX];
0029         scnprintf(buf, sizeof(buf), "%s/%s", LIBDIR, PERF_GTK_DSO);
0030         perf_gtk_handle = dlopen(buf, RTLD_LAZY);
0031     }
0032     if (perf_gtk_handle == NULL)
0033         return -1;
0034 
0035     perf_ui_init = dlsym(perf_gtk_handle, "perf_gtk__init");
0036     if (perf_ui_init == NULL)
0037         goto out_close;
0038 
0039     if (perf_ui_init() == 0)
0040         return 0;
0041 
0042 out_close:
0043     dlclose(perf_gtk_handle);
0044     return -1;
0045 }
0046 
0047 static void exit_gtk_browser(bool wait_for_ok)
0048 {
0049     void (*perf_ui_exit)(bool);
0050 
0051     if (perf_gtk_handle == NULL)
0052         return;
0053 
0054     perf_ui_exit = dlsym(perf_gtk_handle, "perf_gtk__exit");
0055     if (perf_ui_exit == NULL)
0056         goto out_close;
0057 
0058     perf_ui_exit(wait_for_ok);
0059 
0060 out_close:
0061     dlclose(perf_gtk_handle);
0062 
0063     perf_gtk_handle = NULL;
0064 }
0065 #else
0066 static inline int setup_gtk_browser(void) { return -1; }
0067 static inline void exit_gtk_browser(bool wait_for_ok __maybe_unused) {}
0068 #endif
0069 
0070 int stdio__config_color(const struct option *opt __maybe_unused,
0071             const char *mode, int unset __maybe_unused)
0072 {
0073     perf_use_color_default = perf_config_colorbool("color.ui", mode, -1);
0074     return 0;
0075 }
0076 
0077 void setup_browser(bool fallback_to_pager)
0078 {
0079     if (use_browser < 2 && (!isatty(1) || dump_trace))
0080         use_browser = 0;
0081 
0082     /* default to TUI */
0083     if (use_browser < 0)
0084         use_browser = 1;
0085 
0086     switch (use_browser) {
0087     case 2:
0088         if (setup_gtk_browser() == 0)
0089             break;
0090         printf("GTK browser requested but could not find %s\n",
0091                PERF_GTK_DSO);
0092         sleep(1);
0093         use_browser = 1;
0094         /* fall through */
0095     case 1:
0096         if (ui__init() == 0)
0097             break;
0098         /* fall through */
0099     default:
0100         use_browser = 0;
0101         if (fallback_to_pager)
0102             setup_pager();
0103         break;
0104     }
0105 }
0106 
0107 void exit_browser(bool wait_for_ok)
0108 {
0109     switch (use_browser) {
0110     case 2:
0111         exit_gtk_browser(wait_for_ok);
0112         break;
0113 
0114     case 1:
0115         ui__exit(wait_for_ok);
0116         break;
0117 
0118     default:
0119         break;
0120     }
0121 }