Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 191179
b: refs/heads/master
c: 8375319
h: refs/heads/master
i:
  191177: bbd78aa
  191175: 9f3a67e
v: v3
  • Loading branch information
Arnaldo Carvalho de Melo committed Apr 4, 2010
1 parent 8d409f7 commit 65a8a89
Show file tree
Hide file tree
Showing 3 changed files with 91 additions and 33 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 22a4e4c435bbc0edccc2e7e5143ce4fbe9679e2d
refs/heads/master: 83753190c136901c916df267703937e60f24b8b8
119 changes: 88 additions & 31 deletions trunk/tools/perf/util/newt.c
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ static newtComponent newt_form__new(void)
return self;
}

static int popup_menu(int argc, const char *argv[])
static int popup_menu(int argc, char * const argv[])
{
struct newtExitStruct es;
int i, rc = -1, max_len = 5;
Expand Down Expand Up @@ -397,22 +397,8 @@ static struct hist_browser *hist_browser__new(void)
{
struct hist_browser *self = malloc(sizeof(*self));

if (self != NULL) {
char seq[] = ".";
int rows;

newtGetScreenSize(NULL, &rows);

if (symbol_conf.use_callchain)
self->tree = newtCheckboxTreeMulti(0, 0, rows - 5, seq,
NEWT_FLAG_SCROLL);
else
self->tree = newtListbox(0, 0, rows - 5,
(NEWT_FLAG_SCROLL |
NEWT_FLAG_RETURNEXIT));
newtComponentAddCallback(self->tree, hist_browser__selection,
&self->selection);
}
if (self != NULL)
self->form = NULL;

return self;
}
Expand All @@ -431,6 +417,30 @@ static int hist_browser__populate(struct hist_browser *self, struct rb_root *his
struct ui_progress *progress;
struct rb_node *nd;
u64 curr_hist = 0;
char seq[] = ".";
char str[256];

if (self->form) {
newtFormDestroy(self->form);
newtPopWindow();
}

snprintf(str, sizeof(str), "Samples: %Ld ",
session_total);
newtDrawRootText(0, 0, str);

newtGetScreenSize(NULL, &rows);

if (symbol_conf.use_callchain)
self->tree = newtCheckboxTreeMulti(0, 0, rows - 5, seq,
NEWT_FLAG_SCROLL);
else
self->tree = newtListbox(0, 0, rows - 5,
(NEWT_FLAG_SCROLL |
NEWT_FLAG_RETURNEXIT));

newtComponentAddCallback(self->tree, hist_browser__selection,
&self->selection);

progress = ui_progress__new("Adding entries to the browser...", nr_hists);
if (progress == NULL)
Expand All @@ -439,7 +449,12 @@ static int hist_browser__populate(struct hist_browser *self, struct rb_root *his
idx = 0;
for (nd = rb_first(hists); nd; nd = rb_next(nd)) {
struct hist_entry *h = rb_entry(nd, struct hist_entry, rb_node);
int len = hist_entry__append_browser(h, self->tree, session_total);
int len;

if (h->filtered)
continue;

len = hist_entry__append_browser(h, self->tree, session_total);
if (len > max_len)
max_len = len;
if (symbol_conf.use_callchain)
Expand All @@ -463,6 +478,9 @@ static int hist_browser__populate(struct hist_browser *self, struct rb_root *his
newtCenteredWindow(max_len + (symbol_conf.use_callchain ? 5 : 0),
rows - 5, "Report");
self->form = newt_form__new();
if (self->form == NULL)
return -1;

newtFormAddHotKey(self->form, 'A');
newtFormAddHotKey(self->form, 'a');
newtFormAddHotKey(self->form, NEWT_KEY_RIGHT);
Expand All @@ -472,29 +490,50 @@ static int hist_browser__populate(struct hist_browser *self, struct rb_root *his
return 0;
}

static u64 hists__filter_by_dso(struct rb_root *hists, struct dso *dso,
u64 *session_total)
{
struct rb_node *nd;
u64 nr_hists = 0;

*session_total = 0;

for (nd = rb_first(hists); nd; nd = rb_next(nd)) {
struct hist_entry *h = rb_entry(nd, struct hist_entry, rb_node);

if (dso != NULL && (h->ms.map == NULL || h->ms.map->dso != dso)) {
h->filtered = true;
continue;
}
h->filtered = false;
++nr_hists;
*session_total += h->count;
}

return nr_hists;
}

int perf_session__browse_hists(struct rb_root *hists, u64 nr_hists,
u64 session_total, const char *helpline,
const char *input_name)
{
struct newtExitStruct es;
char str[1024];
bool dso_filtered = false;
int err = -1;
struct hist_browser *browser = hist_browser__new();

if (browser == NULL)
return -1;

snprintf(str, sizeof(str), "Samples: %Ld", session_total);
newtDrawRootText(0, 0, str);
newtPushHelpLine(helpline);

if (hist_browser__populate(browser, hists, nr_hists, session_total) < 0)
goto out;

while (1) {
char annotate[512];
const char *options[2];
int nr_options = 0, choice = 0;
char *options[16];
int nr_options = 0, choice = 0, i,
annotate = -2, zoom_dso = -2;

newtFormRun(browser->form, &es);
if (es.reason == NEWT_EXIT_HOTKEY) {
Expand All @@ -510,18 +549,29 @@ int perf_session__browse_hists(struct rb_root *hists, u64 nr_hists,
}
}

if (browser->selection->sym != NULL) {
snprintf(annotate, sizeof(annotate),
"Annotate %s", browser->selection->sym->name);
options[nr_options++] = annotate;
}
if (browser->selection->sym != NULL &&
asprintf(&options[nr_options], "Annotate %s",
browser->selection->sym->name) > 0)
annotate = nr_options++;

if (browser->selection->map != NULL &&
asprintf(&options[nr_options], "Zoom %s %s DSO",
dso_filtered ? "out of" : "into",
(browser->selection->map->dso->kernel ? "the Kernel" :
browser->selection->map->dso->short_name)) > 0)
zoom_dso = nr_options++;

options[nr_options++] = (char *)"Exit";

options[nr_options++] = "Exit";
choice = popup_menu(nr_options, options);

for (i = 0; i < nr_options - 1; ++i)
free(options[i]);

if (choice == nr_options - 1)
break;
do_annotate:
if (browser->selection->sym != NULL && choice >= 0) {
if (choice == annotate) {
if (browser->selection->map->dso->origin == DSO__ORIG_KERNEL) {
newtPopHelpLine();
newtPushHelpLine("No vmlinux file found, can't "
Expand All @@ -531,6 +581,13 @@ int perf_session__browse_hists(struct rb_root *hists, u64 nr_hists,
}
map_symbol__annotate_browser(browser->selection,
input_name);
} if (choice == zoom_dso) {
hists__filter_by_dso(hists,
dso_filtered ? NULL : browser->selection->map->dso,
&session_total);
dso_filtered = !dso_filtered;
if (hist_browser__populate(browser, hists, nr_hists, session_total) < 0)
goto out;
}
}
err = 0;
Expand Down
3 changes: 2 additions & 1 deletion trunk/tools/perf/util/sort.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,8 @@ struct hist_entry {
struct map_symbol ms;
u64 ip;
char level;
struct symbol *parent;
bool filtered;
struct symbol *parent;
union {
unsigned long position;
struct hist_entry *pair;
Expand Down

0 comments on commit 65a8a89

Please sign in to comment.