276
290
screen_newline();
279
static inline void print_tasks_head(void)
281
screen_style_inverted();
282
printf("[taskid] [thrds] [resident] [%%resi] [virtual] [%%virt]"
283
" [%%user] [%%kern] [name");
285
screen_style_normal();
288
static inline void print_tasks(data_t *data)
292
screen_get_size(&cols, &rows);
296
screen_get_pos(&col, &row);
299
for (i = 0; (i < data->tasks_count) && (row < rows); i++, row++) {
300
stats_task_t *task = data->tasks + data->tasks_map[i];
301
perc_task_t *perc = data->tasks_perc + data->tasks_map[i];
304
const char *resmem_suffix;
305
bin_order_suffix(task->resmem, &resmem, &resmem_suffix, true);
308
const char *virtmem_suffix;
309
bin_order_suffix(task->virtmem, &virtmem, &virtmem_suffix, true);
311
printf("%-8" PRIu64 " %7zu %7" PRIu64 "%s ",
312
task->task_id, task->threads, resmem, resmem_suffix);
313
print_percent(perc->resmem, 2);
314
printf(" %6" PRIu64 "%s ", virtmem, virtmem_suffix);
315
print_percent(perc->virtmem, 2);
317
print_percent(perc->ucycles, 2);
319
print_percent(perc->kcycles, 2);
321
print_string(task->name);
332
static inline void print_ipc_head(void)
334
screen_style_inverted();
335
printf("[taskid] [cls snt] [cls rcv] [ans snt]"
336
" [ans rcv] [irq rcv] [forward] [name");
338
screen_style_normal();
341
static inline void print_ipc(data_t *data)
345
screen_get_size(&cols, &rows);
349
screen_get_pos(&col, &row);
352
for (i = 0; (i < data->tasks_count) && (row < rows); i++, row++) {
354
uint64_t call_received;
355
uint64_t answer_sent;
356
uint64_t answer_received;
357
uint64_t irq_notif_received;
360
char call_sent_suffix;
361
char call_received_suffix;
362
char answer_sent_suffix;
363
char answer_received_suffix;
364
char irq_notif_received_suffix;
365
char forwarded_suffix;
367
order_suffix(data->tasks[i].ipc_info.call_sent, &call_sent,
369
order_suffix(data->tasks[i].ipc_info.call_received,
370
&call_received, &call_received_suffix);
371
order_suffix(data->tasks[i].ipc_info.answer_sent,
372
&answer_sent, &answer_sent_suffix);
373
order_suffix(data->tasks[i].ipc_info.answer_received,
374
&answer_received, &answer_received_suffix);
375
order_suffix(data->tasks[i].ipc_info.irq_notif_received,
376
&irq_notif_received, &irq_notif_received_suffix);
377
order_suffix(data->tasks[i].ipc_info.forwarded, &forwarded,
380
printf("%-8" PRIu64 " %8" PRIu64 "%c %8" PRIu64 "%c"
381
" %8" PRIu64 "%c %8" PRIu64 "%c %8" PRIu64 "%c"
382
" %8" PRIu64 "%c ", data->tasks[i].task_id,
383
call_sent, call_sent_suffix,
384
call_received, call_received_suffix,
385
answer_sent, answer_sent_suffix,
386
answer_received, answer_received_suffix,
387
irq_notif_received, irq_notif_received_suffix,
388
forwarded, forwarded_suffix);
389
print_string(data->tasks[i].name);
400
static inline void print_excs_head(void)
402
screen_style_inverted();
403
printf("[exc ] [count ] [%%count] [cycles ] [%%cycles] [description");
405
screen_style_normal();
408
static inline void print_excs(data_t *data)
412
screen_get_size(&cols, &rows);
416
screen_get_pos(&col, &row);
419
for (i = 0; (i < data->exceptions_count) && (row < rows); i++) {
420
/* Filter-out cold exceptions if not instructed otherwise */
421
if ((!excs_all) && (!data->exceptions[i].hot))
430
order_suffix(data->exceptions[i].count, &count, &count_suffix);
431
order_suffix(data->exceptions[i].cycles, &cycles, &cycles_suffix);
433
printf("%-8u %9" PRIu64 "%c ",
434
data->exceptions[i].id, count, count_suffix);
435
print_percent(data->exceptions_perc[i].count, 2);
436
printf(" %9" PRIu64 "%c ", cycles, cycles_suffix);
437
print_percent(data->exceptions_perc[i].cycles, 2);
439
print_string(data->exceptions[i].desc);
451
static void print_help(void)
455
screen_get_size(&cols, &rows);
459
screen_get_pos(&col, &row);
293
static inline void print_help_head(void)
295
screen_style_inverted();
298
screen_style_normal();
301
static inline void print_help(void)
305
screen_get_size(&cols, &rows);
461
307
screen_newline();
475
321
printf(" a .. toggle display of all/hot exceptions");
476
322
screen_newline();
324
printf(" h .. toggle this help screen");
329
printf("Other keys:");
332
printf(" s .. choose column to sort by");
335
printf(" r .. toggle reversed sorting");
338
printf(" q .. quit");
343
screen_get_pos(&col, &row);
351
static inline void print_table_head(const table_t *table)
355
screen_get_size(&cols, &rows);
357
screen_style_inverted();
358
for (size_t i = 0; i < table->num_columns; i++) {
359
const char *name = table->columns[i].name;
360
int width = table->columns[i].width;
367
screen_get_pos(&col, &row);
368
width = cols - col - 1;
370
printf("[%-*.*s]", width - 2, width - 2, name);
373
screen_style_normal();
376
static inline void print_table(const table_t *table)
380
screen_get_size(&cols, &rows);
384
screen_get_pos(&col, &row);
387
for (i = 0; (i < table->num_fields) && (row < rows); i++) {
388
size_t column_index = i % table->num_columns;
389
int width = table->columns[column_index].width;
390
field_t *field = &table->fields[i];
392
if (column_index != 0) {
397
screen_get_pos(&col, &row);
398
width = cols - col - 1;
401
switch (field->type) {
403
printf("%*s", width, "");
406
printf("%*" PRIu64, width, field->uint);
408
case FIELD_UINT_SUFFIX_BIN: {
409
uint64_t val = field->uint;
412
bin_order_suffix(val, &val, &suffix, true);
413
printf("%*" PRIu64 "%s", width, val, suffix);
416
case FIELD_UINT_SUFFIX_DEC: {
417
uint64_t val = field->uint;
420
order_suffix(val, &val, &suffix);
421
printf("%*" PRIu64 "%c", width, val, suffix);
425
width -= 5; /* nnn.% */
427
printf("%*s", width - 2, "");
430
print_percent(field->fixed, width);
433
printf("%-*.*s", width, width, field->string);
437
if (column_index == table->num_columns - 1) {
449
static inline void print_sort(table_t *table)
453
screen_get_size(&cols, &rows);
457
screen_get_pos(&col, &row);
459
size_t num = min(table->num_columns, rows - row);
460
for (size_t i = 0; i < num; i++) {
461
printf("%c - %s", table->columns[i].key, table->columns[i].name);
472
static inline void print_warning(void)
474
screen_get_pos(&warning_col, &warning_row);
475
if (warning_timeleft > 0) {
476
screen_style_emphasis();
477
print_string(warning_text);
478
screen_style_normal();
486
486
void print_data(data_t *data)
491
491
print_thread_summary(data);
492
492
print_cpu_info(data);
493
493
print_physmem_info(data);
495
/* Empty row for warnings */
496
screen_get_pos(&warn_col, &warn_row);
496
switch (screen_mode) {
498
print_table_head(&data->table);
499
print_table(&data->table);
502
print_sort(&data->table);
517
509
console_flush(console);
520
void print_warning(const char *fmt, ...)
512
void show_warning(const char *fmt, ...)
522
screen_moveto(warn_col, warn_row);
516
screen_get_size(&cols, &rows);
518
size_t warning_text_size = 1 + cols * sizeof(*warning_text);
520
warning_text = malloc(warning_text_size);
525
525
va_start(args, fmt);
526
vsnprintf(warning_text, warning_text_size, fmt, args);
529
warning_timeleft = 2 * USEC_COUNT;
531
screen_moveto(warning_col, warning_row);
530
533
console_flush(console);