[PATCH 3/7] perf tools: Move TUI-specific fields to struct hist_entry_tui

From: Namhyung Kim
Date: Sun Apr 19 2015 - 00:05:36 EST


Since perf diff only support stdio output, TUI fields are only accessed
from perf report (or perf top). So add new struct hist_entry_tui and
move those fields into them. And include it as an union member.

Signed-off-by: Namhyung Kim <namhyung@xxxxxxxxxx>
---
tools/perf/ui/browsers/hists.c | 52 +++++++++++++++++++++---------------------
tools/perf/util/hist.c | 4 ++--
tools/perf/util/sort.h | 15 +++++++-----
3 files changed, 37 insertions(+), 34 deletions(-)

diff --git a/tools/perf/ui/browsers/hists.c b/tools/perf/ui/browsers/hists.c
index 995b7a8596b1..8b8a647be999 100644
--- a/tools/perf/ui/browsers/hists.c
+++ b/tools/perf/ui/browsers/hists.c
@@ -61,7 +61,7 @@ static int hist_browser__get_folding(struct hist_browser *browser)
rb_entry(nd, struct hist_entry, rb_node);

if (he->ms.unfolded)
- unfolded_rows += he->nr_rows;
+ unfolded_rows += he->tui.nr_rows;
}
return unfolded_rows;
}
@@ -288,16 +288,16 @@ static bool hist_browser__toggle_fold(struct hist_browser *browser)
struct hist_entry *he = browser->he_selection;

hist_entry__init_have_children(he);
- browser->b.nr_entries -= he->nr_rows;
- browser->nr_callchain_rows -= he->nr_rows;
+ browser->b.nr_entries -= he->tui.nr_rows;
+ browser->nr_callchain_rows -= he->tui.nr_rows;

if (he->ms.unfolded)
- he->nr_rows = callchain__count_rows(&he->sorted_chain);
+ he->tui.nr_rows = callchain__count_rows(&he->sorted_chain);
else
- he->nr_rows = 0;
+ he->tui.nr_rows = 0;

- browser->b.nr_entries += he->nr_rows;
- browser->nr_callchain_rows += he->nr_rows;
+ browser->b.nr_entries += he->tui.nr_rows;
+ browser->nr_callchain_rows += he->tui.nr_rows;

return true;
}
@@ -367,9 +367,9 @@ static void hist_entry__set_folding(struct hist_entry *he, bool unfold)

if (he->ms.has_children) {
int n = callchain__set_folding(&he->sorted_chain, unfold);
- he->nr_rows = unfold ? n : 0;
+ he->tui.nr_rows = unfold ? n : 0;
} else
- he->nr_rows = 0;
+ he->tui.nr_rows = 0;
}

static void
@@ -383,7 +383,7 @@ __hist_browser__set_folding(struct hist_browser *browser, bool unfold)
nd = rb_next(nd)) {
struct hist_entry *he = rb_entry(nd, struct hist_entry, rb_node);
hist_entry__set_folding(he, unfold);
- browser->nr_callchain_rows += he->nr_rows;
+ browser->nr_callchain_rows += he->tui.nr_rows;
}
}

@@ -459,7 +459,7 @@ static int hist_browser__run(struct hist_browser *browser,
browser->b.rows,
browser->b.index,
browser->b.top_idx,
- h->row_offset, h->nr_rows);
+ h->tui.row_offset, h->tui.nr_rows);
}
break;
case 'C':
@@ -742,7 +742,7 @@ static int hist_browser__show_entry(struct hist_browser *browser,
int width = browser->b.width;
char folded_sign = ' ';
bool current_entry = ui_browser__is_current_entry(&browser->b, row);
- off_t row_offset = entry->row_offset;
+ off_t row_offset = entry->tui.row_offset;
bool first = true;
struct perf_hpp_fmt *fmt;

@@ -997,7 +997,7 @@ static void ui_browser__hists_seek(struct ui_browser *browser,
* row_offset:
*/
h = rb_entry(browser->top, struct hist_entry, rb_node);
- h->row_offset = 0;
+ h->tui.row_offset = 0;

/*
* Here we have to check if nd is expanded (+), if it is we can't go
@@ -1017,12 +1017,12 @@ do_offset:
do {
h = rb_entry(nd, struct hist_entry, rb_node);
if (h->ms.unfolded) {
- u16 remaining = h->nr_rows - h->row_offset;
+ u16 remaining = h->tui.nr_rows - h->tui.row_offset;
if (offset > remaining) {
offset -= remaining;
- h->row_offset = 0;
+ h->tui.row_offset = 0;
} else {
- h->row_offset += offset;
+ h->tui.row_offset += offset;
offset = 0;
browser->top = nd;
break;
@@ -1039,21 +1039,21 @@ do_offset:
h = rb_entry(nd, struct hist_entry, rb_node);
if (h->ms.unfolded) {
if (first) {
- if (-offset > h->row_offset) {
- offset += h->row_offset;
- h->row_offset = 0;
+ if (-offset > h->tui.row_offset) {
+ offset += h->tui.row_offset;
+ h->tui.row_offset = 0;
} else {
- h->row_offset += offset;
+ h->tui.row_offset += offset;
offset = 0;
browser->top = nd;
break;
}
} else {
- if (-offset > h->nr_rows) {
- offset += h->nr_rows;
- h->row_offset = 0;
+ if (-offset > h->tui.nr_rows) {
+ offset += h->tui.nr_rows;
+ h->tui.row_offset = 0;
} else {
- h->row_offset = h->nr_rows + offset;
+ h->tui.row_offset = h->tui.nr_rows + offset;
offset = 0;
browser->top = nd;
break;
@@ -1075,7 +1075,7 @@ do_offset:
*/
h = rb_entry(nd, struct hist_entry, rb_node);
if (h->ms.unfolded)
- h->row_offset = h->nr_rows;
+ h->tui.row_offset = h->tui.nr_rows;
break;
}
first = false;
@@ -1083,7 +1083,7 @@ do_offset:
} else {
browser->top = nd;
h = rb_entry(nd, struct hist_entry, rb_node);
- h->row_offset = 0;
+ h->tui.row_offset = 0;
}
}

diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c
index cc22b9158b93..d2fc802db26a 100644
--- a/tools/perf/util/hist.c
+++ b/tools/perf/util/hist.c
@@ -1164,8 +1164,8 @@ static void hists__remove_entry_filter(struct hists *hists, struct hist_entry *h

/* force fold unfiltered entry for simplicity */
h->ms.unfolded = false;
- h->row_offset = 0;
- h->nr_rows = 0;
+ h->tui.row_offset = 0;
+ h->tui.nr_rows = 0;

hists->stats.nr_non_filtered_samples += h->stat.nr_events;

diff --git a/tools/perf/util/sort.h b/tools/perf/util/sort.h
index de3303fe726d..fae3bc5c1ea6 100644
--- a/tools/perf/util/sort.h
+++ b/tools/perf/util/sort.h
@@ -70,6 +70,11 @@ struct hist_entry_diff {
};
};

+struct hist_entry_tui {
+ u16 row_offset;
+ u16 nr_rows;
+};
+
/**
* struct hist_entry - histogram entry
*
@@ -93,18 +98,16 @@ struct hist_entry {
s32 cpu;
u8 cpumode;

- struct hist_entry_diff diff;
-
/* We are added by hists__add_dummy_entry. */
bool dummy;

- /* XXX These two should move to some tree widget lib */
- u16 row_offset;
- u16 nr_rows;
-
bool init_have_children;
char level;
u8 filtered;
+ union {
+ struct hist_entry_diff diff;
+ struct hist_entry_tui tui;
+ };
char *srcline;
struct symbol *parent;
struct rb_root sorted_chain;
--
2.3.5

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