linux/tools/perf/ui/setup.c
<<
>>
Prefs
   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
   8pthread_mutex_t ui__lock = PTHREAD_MUTEX_INITIALIZER;
   9void *perf_gtk_handle;
  10
  11#ifdef HAVE_GTK2_SUPPORT
  12static 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
  35out_close:
  36        dlclose(perf_gtk_handle);
  37        return -1;
  38}
  39
  40static 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
  53out_close:
  54        dlclose(perf_gtk_handle);
  55
  56        perf_gtk_handle = NULL;
  57}
  58#else
  59static inline int setup_gtk_browser(void) { return -1; }
  60static inline void exit_gtk_browser(bool wait_for_ok __maybe_unused) {}
  61#endif
  62
  63void 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                break;
  90        }
  91}
  92
  93void exit_browser(bool wait_for_ok)
  94{
  95        switch (use_browser) {
  96        case 2:
  97                exit_gtk_browser(wait_for_ok);
  98                break;
  99
 100        case 1:
 101                ui__exit(wait_for_ok);
 102                break;
 103
 104        default:
 105                break;
 106        }
 107}
 108