linux/tools/perf/ui/setup.c
<<
>>
Prefs
   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
  10pthread_mutex_t ui__lock = PTHREAD_MUTEX_INITIALIZER;
  11void *perf_gtk_handle;
  12int use_browser = -1;
  13
  14#define PERF_GTK_DSO "libperf-gtk.so"
  15
  16#ifdef HAVE_GTK2_SUPPORT
  17
  18static 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
  41out_close:
  42        dlclose(perf_gtk_handle);
  43        return -1;
  44}
  45
  46static 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
  59out_close:
  60        dlclose(perf_gtk_handle);
  61
  62        perf_gtk_handle = NULL;
  63}
  64#else
  65static inline int setup_gtk_browser(void) { return -1; }
  66static inline void exit_gtk_browser(bool wait_for_ok __maybe_unused) {}
  67#endif
  68
  69int 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
  76void 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
 106void 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}
 121