perf hists: Add support for header span
Add span argument for header callback function. The handling of this argument is completely in the hands of the callback. The only thing the caller ensures is it's zeroed on the beginning. Omitting span skipping in hierarchy headers and gtk code. The c2c code use this to span header lines based on the entries span configuration. Signed-off-by: Jiri Olsa <jolsa@kernel.org> Cc: David Ahern <dsahern@gmail.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Link: http://lkml.kernel.org/r/1470583710-1649-6-git-send-email-jolsa@kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
Родитель
f3705b062e
Коммит
29659ab4e7
|
@ -1034,7 +1034,8 @@ static int hpp__entry_global(struct perf_hpp_fmt *_fmt, struct perf_hpp *hpp,
|
|||
|
||||
static int hpp__header(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
|
||||
struct hists *hists __maybe_unused,
|
||||
int line __maybe_unused)
|
||||
int line __maybe_unused,
|
||||
int *span __maybe_unused)
|
||||
{
|
||||
struct diff_hpp_fmt *dfmt =
|
||||
container_of(fmt, struct diff_hpp_fmt, fmt);
|
||||
|
|
|
@ -1514,6 +1514,7 @@ hists_browser__scnprintf_headers(struct hist_browser *browser, char *buf,
|
|||
struct perf_hpp_fmt *fmt;
|
||||
size_t ret = 0;
|
||||
int column = 0;
|
||||
int span = 0;
|
||||
|
||||
if (symbol_conf.use_callchain) {
|
||||
ret = scnprintf(buf, size, " ");
|
||||
|
@ -1525,10 +1526,13 @@ hists_browser__scnprintf_headers(struct hist_browser *browser, char *buf,
|
|||
if (perf_hpp__should_skip(fmt, hists) || column++ < browser->b.horiz_scroll)
|
||||
continue;
|
||||
|
||||
ret = fmt->header(fmt, &dummy_hpp, hists, line);
|
||||
ret = fmt->header(fmt, &dummy_hpp, hists, line, &span);
|
||||
if (advance_hpp_check(&dummy_hpp, ret))
|
||||
break;
|
||||
|
||||
if (span)
|
||||
continue;
|
||||
|
||||
ret = scnprintf(dummy_hpp.buf, dummy_hpp.size, " ");
|
||||
if (advance_hpp_check(&dummy_hpp, ret))
|
||||
break;
|
||||
|
@ -1562,7 +1566,7 @@ static int hists_browser__scnprintf_hierarchy_headers(struct hist_browser *brows
|
|||
if (column++ < browser->b.horiz_scroll)
|
||||
continue;
|
||||
|
||||
ret = fmt->header(fmt, &dummy_hpp, hists, 0);
|
||||
ret = fmt->header(fmt, &dummy_hpp, hists, 0, NULL);
|
||||
if (advance_hpp_check(&dummy_hpp, ret))
|
||||
break;
|
||||
|
||||
|
@ -1599,7 +1603,7 @@ static int hists_browser__scnprintf_hierarchy_headers(struct hist_browser *brows
|
|||
}
|
||||
first_col = false;
|
||||
|
||||
ret = fmt->header(fmt, &dummy_hpp, hists, 0);
|
||||
ret = fmt->header(fmt, &dummy_hpp, hists, 0, NULL);
|
||||
dummy_hpp.buf[ret] = '\0';
|
||||
|
||||
start = trim(dummy_hpp.buf);
|
||||
|
|
|
@ -549,7 +549,7 @@ static void perf_gtk__show_hierarchy(GtkWidget *window, struct hists *hists,
|
|||
strcat(buf, "+");
|
||||
first_col = false;
|
||||
|
||||
fmt->header(fmt, &hpp, hists, 0);
|
||||
fmt->header(fmt, &hpp, hists, 0, NULL);
|
||||
strcat(buf, ltrim(rtrim(hpp.buf)));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -230,7 +230,8 @@ static int hpp__width_fn(struct perf_hpp_fmt *fmt,
|
|||
}
|
||||
|
||||
static int hpp__header_fn(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
|
||||
struct hists *hists, int line __maybe_unused)
|
||||
struct hists *hists, int line __maybe_unused,
|
||||
int *span __maybe_unused)
|
||||
{
|
||||
int len = hpp__width_fn(fmt, hpp, hists);
|
||||
return scnprintf(hpp->buf, hpp->size, "%*s", len, fmt->name);
|
||||
|
|
|
@ -549,7 +549,7 @@ static int print_hierarchy_header(struct hists *hists, struct perf_hpp *hpp,
|
|||
struct perf_hpp_list_node, list);
|
||||
|
||||
perf_hpp_list__for_each_format(&fmt_node->hpp, fmt) {
|
||||
fmt->header(fmt, hpp, hists, 0);
|
||||
fmt->header(fmt, hpp, hists, 0, NULL);
|
||||
fprintf(fp, "%s%s", hpp->buf, sep ?: " ");
|
||||
}
|
||||
|
||||
|
@ -569,7 +569,7 @@ static int print_hierarchy_header(struct hists *hists, struct perf_hpp *hpp,
|
|||
header_width += fprintf(fp, "+");
|
||||
first_col = false;
|
||||
|
||||
fmt->header(fmt, hpp, hists, 0);
|
||||
fmt->header(fmt, hpp, hists, 0, NULL);
|
||||
|
||||
header_width += fprintf(fp, "%s", trim(hpp->buf));
|
||||
}
|
||||
|
@ -645,18 +645,21 @@ static void fprintf_line(struct hists *hists, struct perf_hpp *hpp,
|
|||
struct perf_hpp_fmt *fmt;
|
||||
const char *sep = symbol_conf.field_sep;
|
||||
bool first = true;
|
||||
int span = 0;
|
||||
|
||||
hists__for_each_format(hists, fmt) {
|
||||
if (perf_hpp__should_skip(fmt, hists))
|
||||
continue;
|
||||
|
||||
if (!first)
|
||||
if (!first && !span)
|
||||
fprintf(fp, "%s", sep ?: " ");
|
||||
else
|
||||
first = false;
|
||||
|
||||
fmt->header(fmt, hpp, hists, line);
|
||||
fprintf(fp, "%s", hpp->buf);
|
||||
fmt->header(fmt, hpp, hists, line, &span);
|
||||
|
||||
if (!span)
|
||||
fprintf(fp, "%s", hpp->buf);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -230,7 +230,7 @@ struct perf_hpp {
|
|||
struct perf_hpp_fmt {
|
||||
const char *name;
|
||||
int (*header)(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
|
||||
struct hists *hists, int line);
|
||||
struct hists *hists, int line, int *span);
|
||||
int (*width)(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
|
||||
struct hists *hists);
|
||||
int (*color)(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
|
||||
|
|
|
@ -1492,7 +1492,8 @@ void perf_hpp__reset_sort_width(struct perf_hpp_fmt *fmt, struct hists *hists)
|
|||
}
|
||||
|
||||
static int __sort__hpp_header(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
|
||||
struct hists *hists, int line __maybe_unused)
|
||||
struct hists *hists, int line __maybe_unused,
|
||||
int *span __maybe_unused)
|
||||
{
|
||||
struct hpp_sort_entry *hse;
|
||||
size_t len = fmt->user_len;
|
||||
|
@ -1798,7 +1799,8 @@ static void update_dynamic_len(struct hpp_dynamic_entry *hde,
|
|||
|
||||
static int __sort__hde_header(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
|
||||
struct hists *hists __maybe_unused,
|
||||
int line __maybe_unused)
|
||||
int line __maybe_unused,
|
||||
int *span __maybe_unused)
|
||||
{
|
||||
struct hpp_dynamic_entry *hde;
|
||||
size_t len = fmt->user_len;
|
||||
|
|
Загрузка…
Ссылка в новой задаче