Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 209265
b: refs/heads/master
c: 9222116
h: refs/heads/master
i:
  209263: 8eaac20
v: v3
  • Loading branch information
Arnaldo Carvalho de Melo committed Aug 10, 2010
1 parent 9d52a0f commit 7ce9a48
Show file tree
Hide file tree
Showing 5 changed files with 126 additions and 47 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: 1e6dd077a880ba5570beb690523b7a78a91a7615
refs/heads/master: 92221162875ec48913d3f9710046e48d599c9cf2
2 changes: 1 addition & 1 deletion trunk/tools/perf/builtin-annotate.c
Original file line number Diff line number Diff line change
Expand Up @@ -285,7 +285,7 @@ static int hist_entry__tty_annotate(struct hist_entry *he)
LIST_HEAD(head);
struct objdump_line *pos, *n;

if (hist_entry__annotate(he, &head) < 0)
if (hist_entry__annotate(he, &head, 0) < 0)
return -1;

if (full_paths)
Expand Down
13 changes: 7 additions & 6 deletions trunk/tools/perf/util/hist.c
Original file line number Diff line number Diff line change
Expand Up @@ -983,9 +983,9 @@ int hist_entry__inc_addr_samples(struct hist_entry *self, u64 ip)
return 0;
}

static struct objdump_line *objdump_line__new(s64 offset, char *line)
static struct objdump_line *objdump_line__new(s64 offset, char *line, size_t privsize)
{
struct objdump_line *self = malloc(sizeof(*self));
struct objdump_line *self = malloc(sizeof(*self) + privsize);

if (self != NULL) {
self->offset = offset;
Expand Down Expand Up @@ -1017,7 +1017,7 @@ struct objdump_line *objdump__get_next_ip_line(struct list_head *head,
}

static int hist_entry__parse_objdump_line(struct hist_entry *self, FILE *file,
struct list_head *head)
struct list_head *head, size_t privsize)
{
struct symbol *sym = self->ms.sym;
struct objdump_line *objdump_line;
Expand Down Expand Up @@ -1068,7 +1068,7 @@ static int hist_entry__parse_objdump_line(struct hist_entry *self, FILE *file,
offset = -1;
}

objdump_line = objdump_line__new(offset, line);
objdump_line = objdump_line__new(offset, line, privsize);
if (objdump_line == NULL) {
free(line);
return -1;
Expand All @@ -1078,7 +1078,8 @@ static int hist_entry__parse_objdump_line(struct hist_entry *self, FILE *file,
return 0;
}

int hist_entry__annotate(struct hist_entry *self, struct list_head *head)
int hist_entry__annotate(struct hist_entry *self, struct list_head *head,
size_t privsize)
{
struct symbol *sym = self->ms.sym;
struct map *map = self->ms.map;
Expand Down Expand Up @@ -1143,7 +1144,7 @@ int hist_entry__annotate(struct hist_entry *self, struct list_head *head)
goto out_free_filename;

while (!feof(file))
if (hist_entry__parse_objdump_line(self, file, head) < 0)
if (hist_entry__parse_objdump_line(self, file, head, privsize) < 0)
break;

pclose(file);
Expand Down
3 changes: 2 additions & 1 deletion trunk/tools/perf/util/hist.h
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,8 @@ size_t hists__fprintf(struct hists *self, struct hists *pair,
bool show_displacement, FILE *fp);

int hist_entry__inc_addr_samples(struct hist_entry *self, u64 ip);
int hist_entry__annotate(struct hist_entry *self, struct list_head *head);
int hist_entry__annotate(struct hist_entry *self, struct list_head *head,
size_t privsize);

void hists__filter_by_dso(struct hists *self, const struct dso *dso);
void hists__filter_by_thread(struct hists *self, const struct thread *thread);
Expand Down
153 changes: 115 additions & 38 deletions trunk/tools/perf/util/ui/browsers/annotate.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,24 +14,65 @@ static void ui__error_window(const char *fmt, ...)
va_end(ap);
}

struct annotate_browser {
struct ui_browser b;
struct rb_root entries;
};

struct objdump_line_rb_node {
struct rb_node rb_node;
double percent;
u32 idx;
};

static inline
struct objdump_line_rb_node *objdump_line__rb(struct objdump_line *self)
{
return (struct objdump_line_rb_node *)(self + 1);
}

static void annotate_browser__write(struct ui_browser *self, void *entry, int row)
{
struct objdump_line *ol = rb_entry(entry, struct objdump_line, node);
bool current_entry = ui_browser__is_current_entry(self, row);
int width = self->width;

if (ol->offset != -1) {
struct hist_entry *he = self->priv;
struct symbol *sym = he->ms.sym;
int len = he->ms.sym->end - he->ms.sym->start;
struct objdump_line_rb_node *olrb = objdump_line__rb(ol);
int color = ui_browser__percent_color(olrb->percent, current_entry);
SLsmg_set_color(color);
slsmg_printf(" %7.2f ", olrb->percent);
if (!current_entry)
SLsmg_set_color(HE_COLORSET_CODE);
} else {
int color = ui_browser__percent_color(0, current_entry);
SLsmg_set_color(color);
slsmg_write_nstring(" ", 9);
}

SLsmg_write_char(':');
slsmg_write_nstring(" ", 8);
if (!*ol->line)
slsmg_write_nstring(" ", width - 18);
else
slsmg_write_nstring(ol->line, width - 18);
}

static double objdump_line__calc_percent(struct objdump_line *self,
struct list_head *head,
struct symbol *sym)
{
double percent = 0.0;

if (self->offset != -1) {
int len = sym->end - sym->start;
unsigned int hits = 0;
double percent = 0.0;
int color;
struct sym_priv *priv = symbol__priv(sym);
struct sym_ext *sym_ext = priv->ext;
struct sym_hist *h = priv->hist;
s64 offset = ol->offset;
struct objdump_line *next = objdump__get_next_ip_line(self->entries, ol);
s64 offset = self->offset;
struct objdump_line *next = objdump__get_next_ip_line(head, self);


while (offset < (s64)len &&
(next == NULL || offset < next->offset)) {
Expand All @@ -45,37 +86,45 @@ static void annotate_browser__write(struct ui_browser *self, void *entry, int ro

if (sym_ext == NULL && h->sum)
percent = 100.0 * hits / h->sum;

color = ui_browser__percent_color(percent, current_entry);
SLsmg_set_color(color);
slsmg_printf(" %7.2f ", percent);
if (!current_entry)
SLsmg_set_color(HE_COLORSET_CODE);
} else {
int color = ui_browser__percent_color(0, current_entry);
SLsmg_set_color(color);
slsmg_write_nstring(" ", 9);
}

SLsmg_write_char(':');
slsmg_write_nstring(" ", 8);
if (!*ol->line)
slsmg_write_nstring(" ", width - 18);
else
slsmg_write_nstring(ol->line, width - 18);
return percent;
}

static void objdump__insert_line(struct rb_root *self,
struct objdump_line_rb_node *line)
{
struct rb_node **p = &self->rb_node;
struct rb_node *parent = NULL;
struct objdump_line_rb_node *l;

while (*p != NULL) {
parent = *p;
l = rb_entry(parent, struct objdump_line_rb_node, rb_node);
if (line->percent < l->percent)
p = &(*p)->rb_left;
else
p = &(*p)->rb_right;
}
rb_link_node(&line->rb_node, parent, p);
rb_insert_color(&line->rb_node, self);
}

int hist_entry__tui_annotate(struct hist_entry *self)
{
struct newtExitStruct es;
struct objdump_line *pos, *n;
struct objdump_line_rb_node *rbpos;
struct rb_node *nd;
LIST_HEAD(head);
struct ui_browser browser = {
.entries = &head,
.refresh = ui_browser__list_head_refresh,
.seek = ui_browser__list_head_seek,
.write = annotate_browser__write,
.priv = self,
struct annotate_browser browser = {
.b = {
.entries = &head,
.refresh = ui_browser__list_head_refresh,
.seek = ui_browser__list_head_seek,
.write = annotate_browser__write,
.priv = self,
},
};
int ret;

Expand All @@ -85,7 +134,7 @@ int hist_entry__tui_annotate(struct hist_entry *self)
if (self->ms.map->dso->annotate_warned)
return -1;

if (hist_entry__annotate(self, &head) < 0) {
if (hist_entry__annotate(self, &head, sizeof(*rbpos)) < 0) {
ui__error_window(ui_helpline__last_msg);
return -1;
}
Expand All @@ -94,16 +143,44 @@ int hist_entry__tui_annotate(struct hist_entry *self)

list_for_each_entry(pos, &head, node) {
size_t line_len = strlen(pos->line);
if (browser.width < line_len)
browser.width = line_len;
++browser.nr_entries;
if (browser.b.width < line_len)
browser.b.width = line_len;
rbpos = objdump_line__rb(pos);
rbpos->idx = browser.b.nr_entries++;
rbpos->percent = objdump_line__calc_percent(pos, &head, self->ms.sym);
if (rbpos->percent < 0.01)
continue;
objdump__insert_line(&browser.entries, rbpos);
}

/*
* Position the browser at the hottest line.
*/
nd = rb_last(&browser.entries);
if (nd != NULL) {
unsigned back;

ui_browser__refresh_dimensions(&browser.b);
back = browser.b.height / 2;
rbpos = rb_entry(nd, struct objdump_line_rb_node, rb_node);
pos = ((struct objdump_line *)rbpos) - 1;
browser.b.top_idx = browser.b.index = rbpos->idx;

while (browser.b.top_idx != 0 && back != 0) {
pos = list_entry(pos->node.prev, struct objdump_line, node);

--browser.b.top_idx;
--back;
}

browser.b.top = pos;
}

browser.width += 18; /* Percentage */
ui_browser__show(&browser, self->ms.sym->name);
newtFormAddHotKey(browser.form, ' ');
ret = ui_browser__run(&browser, &es);
newtFormDestroy(browser.form);
browser.b.width += 18; /* Percentage */
ui_browser__show(&browser.b, self->ms.sym->name);
newtFormAddHotKey(browser.b.form, ' ');
ret = ui_browser__run(&browser.b, &es);
newtFormDestroy(browser.b.form);
newtPopWindow();
list_for_each_entry_safe(pos, n, &head, node) {
list_del(&pos->node);
Expand Down

0 comments on commit 7ce9a48

Please sign in to comment.