| 1 | |
| 2 | #include <dlfcn.h>
|
| 3 | #include <signal.h>
|
| 4 | #include <unistd.h>
|
| 5 |
|
| 6 | #include <subcmd/pager.h>
|
| 7 | #include "../util/debug.h"
|
| 8 | #include "../util/hist.h"
|
| 9 | #include "ui.h"
|
| 10 |
|
| 11 | struct mutex ui__lock;
|
| 12 | void *perf_gtk_handle;
|
| 13 | int use_browser = -1;
|
| 14 |
|
| 15 | #define PERF_GTK_DSO "libperf-gtk.so"
|
| 16 |
|
| 17 | #ifdef HAVE_GTK2_SUPPORT
|
| 18 |
|
| 19 | static int setup_gtk_browser(void)
|
| 20 | {
|
| 21 | int (*perf_ui_init)(void);
|
| 22 |
|
| 23 | if (perf_gtk_handle)
|
| 24 | return 0;
|
| 25 |
|
| 26 | perf_gtk_handle = dlopen(PERF_GTK_DSO, RTLD_LAZY);
|
| 27 | if (perf_gtk_handle == NULL) {
|
| 28 | char buf[PATH_MAX];
|
| 29 | scnprintf(buf, sizeof(buf), "%s/%s", LIBDIR, PERF_GTK_DSO);
|
| 30 | perf_gtk_handle = dlopen(buf, RTLD_LAZY);
|
| 31 | }
|
| 32 | if (perf_gtk_handle == NULL)
|
| 33 | return -1;
|
| 34 |
|
| 35 | perf_ui_init = dlsym(perf_gtk_handle, "perf_gtk__init");
|
| 36 | if (perf_ui_init == NULL)
|
| 37 | goto out_close;
|
| 38 |
|
| 39 | if (perf_ui_init() == 0)
|
| 40 | return 0;
|
| 41 |
|
| 42 | out_close:
|
| 43 | dlclose(perf_gtk_handle);
|
| 44 | return -1;
|
| 45 | }
|
| 46 |
|
| 47 | static void exit_gtk_browser(bool wait_for_ok)
|
| 48 | {
|
| 49 | void (*perf_ui_exit)(bool);
|
| 50 |
|
| 51 | if (perf_gtk_handle == NULL)
|
| 52 | return;
|
| 53 |
|
| 54 | perf_ui_exit = dlsym(perf_gtk_handle, "perf_gtk__exit");
|
| 55 | if (perf_ui_exit == NULL)
|
| 56 | goto out_close;
|
| 57 |
|
| 58 | perf_ui_exit(wait_for_ok);
|
| 59 |
|
| 60 | out_close:
|
| 61 | dlclose(perf_gtk_handle);
|
| 62 |
|
| 63 | perf_gtk_handle = NULL;
|
| 64 | }
|
| 65 | #else
|
| 66 | static inline int setup_gtk_browser(void) { return -1; }
|
| 67 | static inline void exit_gtk_browser(bool wait_for_ok __maybe_unused) {}
|
| 68 | #endif
|
| 69 |
|
| 70 | int stdio__config_color(const struct option *opt __maybe_unused,
|
| 71 | const char *mode, int unset __maybe_unused)
|
| 72 | {
|
| 73 | perf_use_color_default = perf_config_colorbool("color.ui", mode, -1);
|
| 74 | return 0;
|
| 75 | }
|
| 76 |
|
| 77 | void setup_browser(bool fallback_to_pager)
|
| 78 | {
|
| 79 | mutex_init(&ui__lock);
|
| 80 | if (use_browser < 2 && (!isatty(1) || dump_trace))
|
| 81 | use_browser = 0;
|
| 82 |
|
| 83 |
|
| 84 | if (use_browser < 0)
|
| 85 | use_browser = 1;
|
| 86 |
|
| 87 | switch (use_browser) {
|
| 88 | case 2:
|
| 89 | if (setup_gtk_browser() == 0)
|
| 90 | break;
|
| 91 | printf("GTK browser requested but could not find %s\n",
|
| 92 | PERF_GTK_DSO);
|
| 93 | sleep(1);
|
| 94 | use_browser = 1;
|
| 95 |
|
| 96 | case 1:
|
| 97 | if (ui__init() == 0)
|
| 98 | break;
|
| 99 |
|
| 100 | default:
|
| 101 | use_browser = 0;
|
| 102 | if (fallback_to_pager)
|
| 103 | setup_pager();
|
| 104 | break;
|
| 105 | }
|
| 106 | }
|
| 107 |
|
| 108 | void exit_browser(bool wait_for_ok)
|
| 109 | {
|
| 110 | switch (use_browser) {
|
| 111 | case 2:
|
| 112 | exit_gtk_browser(wait_for_ok);
|
| 113 | break;
|
| 114 |
|
| 115 | case 1:
|
| 116 | ui__exit(wait_for_ok);
|
| 117 | break;
|
| 118 |
|
| 119 | default:
|
| 120 | break;
|
| 121 | }
|
| 122 | mutex_destroy(&ui__lock);
|
| 123 | }
|
| 124 |
|
| 125 | void pthread__block_sigwinch(void)
|
| 126 | {
|
| 127 | sigset_t set;
|
| 128 |
|
| 129 | sigemptyset(&set);
|
| 130 | sigaddset(&set, SIGWINCH);
|
| 131 | pthread_sigmask(SIG_BLOCK, &set, NULL);
|
| 132 | }
|
| 133 |
|
| 134 | void pthread__unblock_sigwinch(void)
|
| 135 | {
|
| 136 | sigset_t set;
|
| 137 |
|
| 138 | sigemptyset(&set);
|
| 139 | sigaddset(&set, SIGWINCH);
|
| 140 | pthread_sigmask(SIG_UNBLOCK, &set, NULL);
|
| 141 | }
|