From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757451AbcAUEAd (ORCPT ); Wed, 20 Jan 2016 23:00:33 -0500 Received: from LGEAMRELO11.lge.com ([156.147.23.51]:35448 "EHLO lgeamrelo11.lge.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753986AbcAUEAa (ORCPT ); Wed, 20 Jan 2016 23:00:30 -0500 X-Original-SENDERIP: 156.147.1.125 X-Original-MAILFROM: namhyung@kernel.org X-Original-SENDERIP: 165.244.98.204 X-Original-MAILFROM: namhyung@kernel.org X-Original-SENDERIP: 10.177.227.17 X-Original-MAILFROM: namhyung@kernel.org Date: Thu, 21 Jan 2016 13:00:27 +0900 From: Namhyung Kim To: Arnaldo Carvalho de Melo CC: Ingo Molnar , Peter Zijlstra , Jiri Olsa , LKML , David Ahern , Stephane Eranian , Andi Kleen , Wang Nan Subject: Re: [PATCH 07/17] perf ui/stdio: Align column header for hierarchy output Message-ID: <20160121040027.GB10179@sejong> References: <1452960197-5323-1-git-send-email-namhyung@kernel.org> <1452960197-5323-8-git-send-email-namhyung@kernel.org> <20160120224043.GL18367@kernel.org> MIME-Version: 1.0 In-Reply-To: <20160120224043.GL18367@kernel.org> User-Agent: Mutt/1.5.24 (2015-08-30) X-MIMETrack: Itemize by SMTP Server on LGEKRMHUB05/LGE/LG Group(Release 8.5.3FP6|November 21, 2013) at 2016/01/21 13:00:28, Serialize by Router on LGEKRMHUB05/LGE/LG Group(Release 8.5.3FP6|November 21, 2013) at 2016/01/21 13:00:28, Serialize complete at 2016/01/21 13:00:28 Content-Type: text/plain; charset="utf-8" Content-Disposition: inline Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, Jan 20, 2016 at 07:40:43PM -0300, Arnaldo Carvalho de Melo wrote: > Em Sun, Jan 17, 2016 at 01:03:07AM +0900, Namhyung Kim escreveu: > > The hierarchy output mode is to group entries so the existing columns > > won't fit to the new output. Treat all sort keys as a single column and > > separate headers by "/". [SNIP] > > +static int print_hierarchy_header(struct hists *hists, struct perf_hpp *hpp, > > + const char *sep, FILE *fp) > > +{ > > + bool first = true; > > + int nr_sort; > > + unsigned width = 0; > > + unsigned header_width = 0; > > + struct perf_hpp_fmt *fmt; > > + const char spaces[] = " " > > + " " > > + " "; > > + const char dots[] = "................................................." > > + "....................................................................." > > + "....................................................................."; > > + > > + nr_sort = perf_hpp__count_sort_keys(); > > + > > + /* preserve max indent depth for column headers */ > > + print_hierarchy_indent(sep, nr_sort, spaces, fp); > > + > > + perf_hpp__for_each_format(fmt) { > > + if (perf_hpp__is_sort_entry(fmt) || perf_hpp__is_dynamic_entry(fmt)) > > + break; > > + > > + if (!first) > > + fprintf(fp, "%s", sep ?: " "); > > + else > > + first = false; > > + > > + fmt->header(fmt, hpp, hists_to_evsel(hists)); > > + fprintf(fp, "%s", hpp->buf); > > We already have code that prints dots or spaces according to a given > width, but in tools/perf/ui/stdio/hist.c hists__fprintf() it does it > using a fprintf loop, gack, would be better to settle in one way. Agreed. > > Can be done later, sure, processing as-is. Thanks! Namhyung > > > + } > > + > > + /* combine sort headers with ' / ' */ > > + first = true; > > + perf_hpp__for_each_format(fmt) { > > + if (!perf_hpp__is_sort_entry(fmt) && !perf_hpp__is_dynamic_entry(fmt)) > > + continue; > > + > > + if (!first) > > + header_width += fprintf(fp, " / "); > > + else { > > + header_width += fprintf(fp, "%s", sep ?: " "); > > + first = false; > > + } > > + > > + fmt->header(fmt, hpp, hists_to_evsel(hists)); > > + rtrim(hpp->buf); > > + > > + header_width += fprintf(fp, "%s", hpp->buf); > > + } > > + > > + /* preserve max indent depth for combined sort headers */ > > + print_hierarchy_indent(sep, nr_sort, spaces, fp); > > + > > + fprintf(fp, "\n# "); > > + > > + /* preserve max indent depth for initial dots */ > > + print_hierarchy_indent(sep, nr_sort, dots, fp); > > + > > + first = true; > > + perf_hpp__for_each_format(fmt) { > > + if (perf_hpp__is_sort_entry(fmt) || perf_hpp__is_dynamic_entry(fmt)) > > + break; > > + > > + if (!first) > > + fprintf(fp, "%s", sep ?: " "); > > + else > > + first = false; > > + > > + width = fmt->width(fmt, hpp, hists_to_evsel(hists)); > > + fprintf(fp, "%.*s", width, dots); > > + } > > + > > + perf_hpp__for_each_format(fmt) { > > + if (!perf_hpp__is_sort_entry(fmt) && !perf_hpp__is_dynamic_entry(fmt)) > > + continue; > > + > > + width = fmt->width(fmt, hpp, hists_to_evsel(hists)); > > + if (width > header_width) > > + header_width = width; > > + } > > + > > + fprintf(fp, "%s%-.*s", sep ?: " ", header_width, dots); > > + > > + /* preserve max indent depth for dots under sort headers */ > > + print_hierarchy_indent(sep, nr_sort, dots, fp); > > + > > + fprintf(fp, "\n#\n"); > > + > > + return 2; > > +} > > + > > size_t hists__fprintf(struct hists *hists, bool show_header, int max_rows, > > int max_cols, float min_pcnt, FILE *fp) > > { > > @@ -533,6 +635,11 @@ size_t hists__fprintf(struct hists *hists, bool show_header, int max_rows, > > > > fprintf(fp, "# "); > > > > + if (symbol_conf.report_hierarchy) { > > + nr_rows += print_hierarchy_header(hists, &dummy_hpp, sep, fp); > > + goto print_entries; > > + } > > + > > perf_hpp__for_each_format(fmt) { > > if (perf_hpp__should_skip(fmt, hists)) > > continue; > > -- > > 2.6.4