lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite for Android: free password hash cracker in your pocket
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:	Sun,  9 Aug 2015 17:21:02 +0900
From:	Namhyung Kim <namhyung@...nel.org>
To:	Arnaldo Carvalho de Melo <acme@...nel.org>
Cc:	Ingo Molnar <mingo@...nel.org>,
	Peter Zijlstra <a.p.zijlstra@...llo.nl>,
	Jiri Olsa <jolsa@...hat.com>,
	LKML <linux-kernel@...r.kernel.org>,
	David Ahern <dsahern@...il.com>,
	Andi Kleen <andi@...stfloor.org>
Subject: [PATCH v2 2/2] perf hists browser: Support horizontal scrolling for callchains

In the previous patch, horizontal scrolling was added to TUI browser.
However it lacks support for callchains.  This patch adds it.

Signed-off-by: Namhyung Kim <namhyung@...nel.org>
---
 tools/perf/ui/browsers/hists.c | 46 +++++++++++++++++++++++++++++++++++++-----
 1 file changed, 41 insertions(+), 5 deletions(-)

diff --git a/tools/perf/ui/browsers/hists.c b/tools/perf/ui/browsers/hists.c
index 9f6e960be3a6..10af42f5283e 100644
--- a/tools/perf/ui/browsers/hists.c
+++ b/tools/perf/ui/browsers/hists.c
@@ -526,6 +526,7 @@ struct callchain_print_arg {
 	/* for file dump */
 	FILE	*fp;
 	int	printed;
+	int	skip_cols;
 };
 
 typedef void (*print_callchain_entry_fn)(struct hist_browser *browser,
@@ -534,6 +535,30 @@ typedef void (*print_callchain_entry_fn)(struct hist_browser *browser,
 					 unsigned short row,
 					 struct callchain_print_arg *arg);
 
+static int callchain_print_skip(struct callchain_print_arg *arg,
+				const char *str, int width)
+{
+	if (arg->skip_cols) {
+		int len = strlen(str);
+
+		if (width <= arg->skip_cols) {
+			arg->skip_cols -= width;
+			return 0;
+		}
+
+		if (arg->skip_cols < len)
+			str += arg->skip_cols;
+		else
+			str = " ";
+
+		width -= arg->skip_cols;
+		arg->skip_cols = 0;
+	}
+
+	slsmg_write_nstring(str, width);
+	return width;
+}
+
 static void hist_browser__show_callchain_entry(struct hist_browser *browser,
 					       struct callchain_list *chain,
 					       const char *str, int offset,
@@ -543,9 +568,10 @@ static void hist_browser__show_callchain_entry(struct hist_browser *browser,
 	int color, width;
 	char folded_sign = callchain_list__folded(chain);
 	bool show_annotated = browser->show_dso && chain->ms.sym && symbol__annotation(chain->ms.sym)->src;
+	char buf[2] = { folded_sign, 0 };
 
 	color = HE_COLORSET_NORMAL;
-	width = browser->b.width - (offset + 2);
+	width = browser->b.width;
 	if (ui_browser__is_current_entry(&browser->b, row)) {
 		browser->selection = &chain->ms;
 		color = HE_COLORSET_SELECTED;
@@ -554,10 +580,17 @@ static void hist_browser__show_callchain_entry(struct hist_browser *browser,
 
 	ui_browser__set_color(&browser->b, color);
 	hist_browser__gotorc(browser, row, 0);
-	slsmg_write_nstring(" ", offset);
-	slsmg_printf("%c", folded_sign);
-	ui_browser__write_graph(&browser->b, show_annotated ? SLSMG_RARROW_CHAR : ' ');
-	slsmg_write_nstring(str, width);
+	width -= callchain_print_skip(arg, " ", offset);
+	width -= callchain_print_skip(arg, buf, 1);
+	if (arg->skip_cols > 0)
+		arg->skip_cols--;
+	else {
+		ui_browser__write_graph(&browser->b,
+					show_annotated ? SLSMG_RARROW_CHAR : ' ');
+		width--;
+	}
+	width -= callchain_print_skip(arg, str, width);
+	slsmg_write_nstring("", width);
 }
 
 static void hist_browser__fprintf_callchain_entry(struct hist_browser *b __maybe_unused,
@@ -642,6 +675,7 @@ static int hist_browser__show_callchain(struct hist_browser *browser,
 					str = alloc_str;
 			}
 
+			arg->skip_cols = browser->skip_cols;
 			print(browser, chain, str, offset + extra_offset, row, arg);
 
 			free(alloc_str);
@@ -661,6 +695,7 @@ do_next:
 			else
 				new_total = total;
 
+			arg->skip_cols = browser->skip_cols;
 			row += hist_browser__show_callchain(browser, &child->rb_root,
 							    new_level, row, new_total,
 							    print, arg, is_output_full);
@@ -867,6 +902,7 @@ static int hist_browser__show_entry(struct hist_browser *browser,
 		struct callchain_print_arg arg = {
 			.row_offset = row_offset,
 			.is_current_entry = current_entry,
+			.skip_cols = browser->skip_cols,
 		};
 
 		if (callchain_param.mode == CHAIN_GRAPH_REL) {
-- 
2.5.0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ