Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c31a9457 authored by Pekka Enberg's avatar Pekka Enberg Committed by Arnaldo Carvalho de Melo
Browse files

perf report: Add a simple GTK2-based 'perf report' browser



This patch adds a simple GTK2-based browser to 'perf report' that's
based on the TTY-based browser in builtin-report.c.

To launch "perf report" using the new GTK interface just type:

  $ perf report --gtk

The interface is somewhat limited in features at the moment:

  - No callgraph support

  - No KVM guest profiling support

  - No color coding for percentages

  - No sorting from the UI

  - ..and many, many more!

That said, I think this patch a reasonable start to build future features on.

Signed-off-by: default avatarPekka Enberg <penberg@kernel.org>
Cc: Colin Walters <walters@verbum.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Ingo Molnar <mingo@kernel.org>
Link: http://lkml.kernel.org/r/alpine.LFD.2.02.1202231952410.6689@tux.localdomain


[ committer note: Added #pragma to make gtk no strict prototype problem go
  away as suggested by Colin Walters modulo avoiding push/pop ]
Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent fde0eeab
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -113,6 +113,8 @@ OPTIONS
	requires a tty, if one is not present, as when piping to other
	commands, the stdio interface is used.

--gtk:: Use the GTK2 interface.

-k::
--vmlinux=<file>::
        vmlinux pathname
+14 −0
Original line number Diff line number Diff line
@@ -507,6 +507,20 @@ else
	endif
endif

ifdef NO_GTK2
	BASIC_CFLAGS += -DNO_GTK2
else
	FLAGS_GTK2=$(ALL_CFLAGS) $(ALL_LDFLAGS) $(EXTLIBS) $(shell pkg-config --libs --cflags gtk+-2.0)
	ifneq ($(call try-cc,$(SOURCE_GTK2),$(FLAGS_GTK2)),y)
		msg := $(warning GTK2 not found, disables GTK2 support. Please install gtk2-devel or libgtk2.0-dev);
		BASIC_CFLAGS += -DNO_GTK2_SUPPORT
	else
		BASIC_CFLAGS += $(shell pkg-config --cflags gtk+-2.0)
		EXTLIBS += $(shell pkg-config --libs gtk+-2.0)
		LIB_OBJS += $(OUTPUT)util/gtk/browser.o
	endif
endif

ifdef NO_LIBPERL
	BASIC_CFLAGS += -DNO_LIBPERL
else
+15 −4
Original line number Diff line number Diff line
@@ -40,7 +40,7 @@ struct perf_report {
	struct perf_tool	tool;
	struct perf_session	*session;
	char const		*input_name;
	bool			force, use_tui, use_stdio;
	bool			force, use_tui, use_gtk, use_stdio;
	bool			hide_unresolved;
	bool			dont_use_callchains;
	bool			show_full_info;
@@ -415,8 +415,13 @@ static int __cmd_report(struct perf_report *rep)
	}

	if (use_browser > 0) {
		if (use_browser == 1) {
			perf_evlist__tui_browse_hists(session->evlist, help,
						      NULL, NULL, 0);
		} else if (use_browser == 2) {
			perf_evlist__gtk_browse_hists(session->evlist, help,
						      NULL, NULL, 0);
		}
	} else
		perf_evlist__tty_browse_hists(session->evlist, rep, help);

@@ -573,6 +578,7 @@ int cmd_report(int argc, const char **argv, const char *prefix __used)
	OPT_STRING(0, "pretty", &report.pretty_printing_style, "key",
		   "pretty printing style key: normal raw"),
	OPT_BOOLEAN(0, "tui", &report.use_tui, "Use the TUI interface"),
	OPT_BOOLEAN(0, "gtk", &report.use_gtk, "Use the GTK2 interface"),
	OPT_BOOLEAN(0, "stdio", &report.use_stdio,
		    "Use the stdio interface"),
	OPT_STRING('s', "sort", &sort_order, "key[,key2...]",
@@ -630,6 +636,8 @@ int cmd_report(int argc, const char **argv, const char *prefix __used)
		use_browser = 0;
	else if (report.use_tui)
		use_browser = 1;
	else if (report.use_gtk)
		use_browser = 2;

	if (report.inverted_callchain)
		callchain_param.order = ORDER_CALLER;
@@ -666,6 +674,9 @@ int cmd_report(int argc, const char **argv, const char *prefix __used)
	}

	if (strcmp(report.input_name, "-") != 0) {
		if (report.use_gtk)
			perf_gtk_setup_browser(argc, argv, true);
		else
			setup_browser(true);
	} else {
		use_browser = 0;
+15 −0
Original line number Diff line number Diff line
@@ -65,6 +65,21 @@ int main(void)
endef
endif

ifndef NO_GTK2
define SOURCE_GTK2
#pragma GCC diagnostic ignored \"-Wstrict-prototypes\"
#include <gtk/gtk.h>
#pragma GCC diagnostic error \"-Wstrict-prototypes\"

int main(int argc, char *argv[])
{
        gtk_init(&argc, &argv);

        return 0;
}
endef
endif

ifndef NO_LIBPERL
define SOURCE_PERL_EMBED
#include <EXTERN.h>
+12 −0
Original line number Diff line number Diff line
@@ -45,6 +45,18 @@ void setup_browser(bool fallback_to_pager);
void exit_browser(bool wait_for_ok);
#endif

#ifdef NO_GTK2_SUPPORT
static inline void perf_gtk_setup_browser(int argc __used, const char *argv[] __used, bool fallback_to_pager)
{
	if (fallback_to_pager)
		setup_pager();
}
static inline void perf_gtk_exit_browser(bool wait_for_ok __used) {}
#else
void perf_gtk_setup_browser(int argc, const char *argv[], bool fallback_to_pager);
void perf_gtk_exit_browser(bool wait_for_ok);
#endif

char *alias_lookup(const char *alias);
int split_cmdline(char *cmdline, const char ***argv);

Loading