brintos

brintos / linux-shallow public Read only

0
0
Text · 2.5 KiB · ff80004 Raw
142 lines · c
1// SPDX-License-Identifier: GPL-2.02#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 11struct mutex ui__lock;12void *perf_gtk_handle;13int use_browser = -1;14 15#define PERF_GTK_DSO "libperf-gtk.so"16 17#ifdef HAVE_GTK2_SUPPORT18 19static 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 42out_close:43	dlclose(perf_gtk_handle);44	return -1;45}46 47static 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 60out_close:61	dlclose(perf_gtk_handle);62 63	perf_gtk_handle = NULL;64}65#else66static inline int setup_gtk_browser(void) { return -1; }67static inline void exit_gtk_browser(bool wait_for_ok __maybe_unused) {}68#endif69 70int 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 77void 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	/* default to TUI */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		/* fall through */96	case 1:97		if (ui__init() == 0)98			break;99		/* fall through */100	default:101		use_browser = 0;102		if (fallback_to_pager)103			setup_pager();104		break;105	}106}107 108void 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 125void 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 134void 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}142