Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 269015
b: refs/heads/master
c: dcc101d
h: refs/heads/master
i:
  269013: 4c4970b
  269011: 51f5e2b
  269007: 33cbc63
v: v3
  • Loading branch information
Arnaldo Carvalho de Melo committed Sep 29, 2011
1 parent 73526c1 commit ec72603
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 18 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: eb489008312c848dce8ff76282b8e65c530c2e26
refs/heads/master: dcc101d1d02eb80ab0349c5410f8728412c35636
34 changes: 17 additions & 17 deletions trunk/tools/perf/builtin-top.c
Original file line number Diff line number Diff line change
Expand Up @@ -250,7 +250,7 @@ static void __list_insert_active_sym(struct sym_entry *syme)
list_add(&syme->node, &top.active_symbols);
}

static void print_sym_table(struct perf_session *session)
static void print_sym_table(void)
{
char bf[160];
int printed = 0;
Expand All @@ -270,10 +270,11 @@ static void print_sym_table(struct perf_session *session)

printf("%-*.*s\n", win_width, win_width, graph_dotted_line);

if (session->hists.stats.total_lost != 0) {
if (top.total_lost_warned != top.session->hists.stats.total_lost) {
top.total_lost_warned = top.session->hists.stats.total_lost;
color_fprintf(stdout, PERF_COLOR_RED, "WARNING:");
printf(" LOST %" PRIu64 " events, Check IO/CPU overload\n",
session->hists.stats.total_lost);
top.total_lost_warned);
}

if (top.sym_filter_entry) {
Expand Down Expand Up @@ -474,7 +475,7 @@ static int key_mapped(int c)
return 0;
}

static void handle_keypress(struct perf_session *session, int c)
static void handle_keypress(int c)
{
if (!key_mapped(c)) {
struct pollfd stdin_poll = { .fd = 0, .events = POLLIN };
Expand Down Expand Up @@ -550,7 +551,7 @@ static void handle_keypress(struct perf_session *session, int c)
case 'Q':
printf("exiting.\n");
if (dump_symtab)
perf_session__fprintf_dsos(session, stderr);
perf_session__fprintf_dsos(top.session, stderr);
exit(0);
case 's':
prompt_symbol(&top.sym_filter_entry, "Enter details symbol");
Expand Down Expand Up @@ -602,7 +603,6 @@ static void *display_thread(void *arg __used)
struct pollfd stdin_poll = { .fd = 0, .events = POLLIN };
struct termios tc, save;
int delay_msecs, c;
struct perf_session *session = (struct perf_session *) arg;

tcgetattr(0, &save);
tc = save;
Expand All @@ -617,13 +617,13 @@ static void *display_thread(void *arg __used)
getc(stdin);

do {
print_sym_table(session);
print_sym_table();
} while (!poll(&stdin_poll, 1, delay_msecs) == 1);

c = getc(stdin);
tcsetattr(0, TCSAFLUSH, &save);

handle_keypress(session, c);
handle_keypress(c);
goto repeat;

return NULL;
Expand Down Expand Up @@ -935,27 +935,27 @@ static int __cmd_top(void)
* FIXME: perf_session__new should allow passing a O_MMAP, so that all this
* mmap reading, etc is encapsulated in it. Use O_WRONLY for now.
*/
struct perf_session *session = perf_session__new(NULL, O_WRONLY, false, false, NULL);
if (session == NULL)
top.session = perf_session__new(NULL, O_WRONLY, false, false, NULL);
if (top.session == NULL)
return -ENOMEM;

if (top.target_tid != -1)
perf_event__synthesize_thread_map(top.evlist->threads,
perf_event__process, session);
perf_event__process, top.session);
else
perf_event__synthesize_threads(perf_event__process, session);
perf_event__synthesize_threads(perf_event__process, top.session);

start_counters(top.evlist);
session->evlist = top.evlist;
perf_session__update_sample_type(session);
top.session->evlist = top.evlist;
perf_session__update_sample_type(top.session);

/* Wait for a minimal set of events before starting the snapshot */
poll(top.evlist->pollfd, top.evlist->nr_fds, 100);

perf_session__mmap_read(session);
perf_session__mmap_read(top.session);

if (pthread_create(&thread, NULL, (use_browser > 0 ? display_thread_tui :
display_thread), session)) {
display_thread), NULL)) {
printf("Could not create display thread.\n");
exit(-1);
}
Expand All @@ -973,7 +973,7 @@ static int __cmd_top(void)
while (1) {
u64 hits = top.samples;

perf_session__mmap_read(session);
perf_session__mmap_read(top.session);

if (hits == top.samples)
ret = poll(top.evlist->pollfd, top.evlist->nr_fds, 100);
Expand Down
3 changes: 3 additions & 0 deletions trunk/tools/perf/util/top.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@

struct perf_evlist;
struct perf_evsel;
struct perf_session;

struct sym_entry {
struct rb_node rb_node;
Expand Down Expand Up @@ -38,13 +39,15 @@ struct perf_top {
u64 kernel_samples, us_samples;
u64 exact_samples;
u64 guest_us_samples, guest_kernel_samples;
u64 total_lost_warned;
int print_entries, count_filter, delay_secs;
int display_weighted, freq, rb_entries;
pid_t target_pid, target_tid;
bool hide_kernel_symbols, hide_user_symbols, zero;
const char *cpu_list;
struct sym_entry *sym_filter_entry;
struct perf_evsel *sym_evsel;
struct perf_session *session;
};

size_t perf_top__header_snprintf(struct perf_top *top, char *bf, size_t size);
Expand Down
24 changes: 24 additions & 0 deletions trunk/tools/perf/util/ui/browsers/top.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,12 @@
#include "../helpline.h"
#include "../libslang.h"
#include "../util.h"
#include "../ui.h"
#include "../../evlist.h"
#include "../../hist.h"
#include "../../sort.h"
#include "../../symbol.h"
#include "../../session.h"
#include "../../top.h"

struct perf_top_browser {
Expand Down Expand Up @@ -143,6 +145,25 @@ static void perf_top_browser__annotate(struct perf_top_browser *browser)
symbol__tui_annotate(sym, syme->map, 0, top->delay_secs * 1000);
}

static void perf_top_browser__warn_lost(struct perf_top_browser *browser)
{
struct perf_top *top = browser->b.priv;
char msg[128];
int len;

top->total_lost_warned = top->session->hists.stats.total_lost;
pthread_mutex_lock(&ui__lock);
ui_browser__set_color(&browser->b, HE_COLORSET_TOP);
len = snprintf(msg, sizeof(msg),
" WARNING: LOST %" PRIu64 " events, Check IO/CPU overload",
top->total_lost_warned);
if (len > browser->b.width)
len = browser->b.width;
SLsmg_gotorc(0, browser->b.width - len);
slsmg_write_nstring(msg, len);
pthread_mutex_unlock(&ui__lock);
}

static int perf_top_browser__run(struct perf_top_browser *browser)
{
int key;
Expand Down Expand Up @@ -174,6 +195,9 @@ static int perf_top_browser__run(struct perf_top_browser *browser)
ui_browser__set_color(&browser->b, NEWT_COLORSET_ROOT);
SLsmg_gotorc(0, 0);
slsmg_write_nstring(title, browser->b.width);

if (top->total_lost_warned != top->session->hists.stats.total_lost)
perf_top_browser__warn_lost(browser);
break;
case 'a':
case NEWT_KEY_RIGHT:
Expand Down

0 comments on commit ec72603

Please sign in to comment.