On Tue, Apr 22, 2014 at 05:49:51PM +0900, Namhyung Kim wrote:
> When TUI hist browser expands/collapses callchains it accounted number
> of callchain nodes into total entries to show.  However this code
> ignores filtering so that it can make the cursor go to out of screen.
> 
> Signed-off-by: Namhyung Kim <namhy...@kernel.org>
> ---
>  tools/perf/ui/browsers/hists.c | 38 ++++++++++++++++++++++++++++----------
>  1 file changed, 28 insertions(+), 10 deletions(-)
> 
> diff --git a/tools/perf/ui/browsers/hists.c b/tools/perf/ui/browsers/hists.c
> index 886eee0062e0..215f10429dda 100644
> --- a/tools/perf/ui/browsers/hists.c
> +++ b/tools/perf/ui/browsers/hists.c
> @@ -27,6 +27,7 @@ struct hist_browser {
>       bool                 show_dso;
>       float                min_pcnt;
>       u64                  nr_non_filtered_entries;
> +     u64                  nr_callchain_rows;
>  };
>  
>  extern void hist_browser__init_hpp(void);
> @@ -35,6 +36,10 @@ static int hists__browser_title(struct hists *hists, char 
> *bf, size_t size,
>                               const char *ev_name);
>  static void hist_browser__update_nr_entries(struct hist_browser *hb);
>  
> +static struct rb_node *hists__filter_entries(struct rb_node *nd,
> +                                          struct hists *hists,
> +                                          float min_pcnt);
> +
>  static bool hist_browser__has_filter(struct hist_browser *hb)
>  {
>       return hists__has_filter(hb->hists) || hb->min_pcnt;
> @@ -51,6 +56,7 @@ static void hist_browser__reset(struct hist_browser 
> *browser)
>  {
>       hist_browser__update_nr_entries(browser);
>       browser->b.nr_entries = browser->nr_non_filtered_entries;
> +     browser->b.nr_entries += browser->nr_callchain_rows;
>       hist_browser__refresh_dimensions(browser);
>       ui_browser__reset_index(&browser->b);
>  }
> @@ -205,14 +211,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->hists->nr_entries -= he->nr_rows;
> +             browser->b.nr_entries -= he->nr_rows;

does browser->b.nr_entries need to be updated in here?

it gets set in hist_browser__reset and hist_browser__run

> +             browser->nr_callchain_rows -= he->nr_rows;
>  
>               if (he->ms.unfolded)
>                       he->nr_rows = callchain__count_rows(&he->sorted_chain);
>               else
>                       he->nr_rows = 0;
> -             browser->hists->nr_entries += he->nr_rows;
> -             browser->b.nr_entries = browser->hists->nr_entries;
> +
> +             browser->b.nr_entries += he->nr_rows;

ditto

> +             browser->nr_callchain_rows += he->nr_rows;
>  
>               return true;
>       }
> @@ -287,23 +295,31 @@ static void hist_entry__set_folding(struct hist_entry 
> *he, bool unfold)
>               he->nr_rows = 0;
>  }
>  
> -static void hists__set_folding(struct hists *hists, bool unfold)
> +static void
> +__hist_browser__set_folding(struct hist_browser *browser, bool unfold)
>  {
>       struct rb_node *nd;
> +     struct hists *hists = browser->hists;
>  
> -     hists->nr_entries = 0;
> -
> -     for (nd = rb_first(&hists->entries); nd; nd = rb_next(nd)) {
> +     for (nd = rb_first(&hists->entries);
> +          (nd = hists__filter_entries(nd, hists, browser->min_pcnt)) != NULL;
> +          nd = rb_next(nd)) {
>               struct hist_entry *he = rb_entry(nd, struct hist_entry, 
> rb_node);
>               hist_entry__set_folding(he, unfold);
> -             hists->nr_entries += 1 + he->nr_rows;
> +             browser->nr_callchain_rows += he->nr_rows;
>       }
>  }
>  
>  static void hist_browser__set_folding(struct hist_browser *browser, bool 
> unfold)
>  {
> -     hists__set_folding(browser->hists, unfold);
> -     browser->b.nr_entries = browser->hists->nr_entries;
> +     browser->nr_callchain_rows = 0;
> +     __hist_browser__set_folding(browser, unfold);
> +
> +     if (hist_browser__has_filter(browser))
> +             browser->b.nr_entries = browser->nr_non_filtered_entries;
> +     else
> +             browser->b.nr_entries = browser->hists->nr_entries;
> +     browser->b.nr_entries += browser->nr_callchain_rows;

ditto,

I think whole condition above could go away, it's the same as in the
hist_browser__run, which is going to be executed after this anyway..

just setup browser->nr_callchain_rows


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

Reply via email to