capture: Move print methods out of cli for reuse.

Methods to print the data were moved from capture-cli into
a support area and are no longer static so that they can
be shared by test routines, or application code that wants
to use the capture engine without the shell interface.
This commit is contained in:
Jennifer Averett
2014-11-06 08:26:38 -06:00
parent 3d5bcdedfd
commit 04a13bdf74
4 changed files with 371 additions and 210 deletions

View File

@@ -5,7 +5,7 @@
All rights reserved Objective Design Systems Pty Ltd, 2002
Chris Johns (ccj@acm.org)
COPYRIGHT (c) 1989-1998.
COPYRIGHT (c) 1989-2014.
On-Line Applications Research Corporation (OAR).
The license and distribution terms for this file may be
@@ -34,6 +34,7 @@
#include <rtems.h>
#include <rtems/capture-cli.h>
#include <rtems/captureimpl.h>
#include <rtems/monitor.h>
#include <rtems/cpuuse.h>
#
@@ -209,31 +210,6 @@ rtems_capture_cli_disable (int argc RC_UNUSED,
fprintf (stdout, "capture engine disabled.\n");
}
/*
* rtems_catpure_cli_print_uptime
*
* DESCRIPTION:
*
* This function prints the nanosecond uptime to stdout.
*/
static void
rtems_capture_cli_print_timestamp (uint64_t uptime)
{
uint32_t hours;
uint32_t minutes;
uint32_t seconds;
uint32_t nanosecs;
seconds = uptime / 1000000000LLU;
minutes = seconds / 60;
hours = minutes / 60;
minutes = minutes % 60;
seconds = seconds % 60;
nanosecs = uptime % 1000000000;
fprintf (stdout, "%5lu:%02lu:%02lu.%09lu", hours, minutes, seconds, nanosecs);
}
static void
rtems_capture_cli_print_task (rtems_tcb *tcb)
{
@@ -273,47 +249,6 @@ rtems_capture_cli_print_task (rtems_tcb *tcb)
}
fprintf (stdout, "\n");
}
static void
rtems_caputure_cli_print_record_std(rtems_capture_record_t* rec, uint64_t diff)
{
uint32_t event;
int e;
event = rec->events >> RTEMS_CAPTURE_EVENT_START;
for (e = RTEMS_CAPTURE_EVENT_START; e < RTEMS_CAPTURE_EVENT_END; e++)
{
if (event & 1)
{
rtems_capture_cli_print_timestamp (rec->time);
fprintf (stdout, " %9" PRId64 " ", diff);
rtems_monitor_dump_id (rec->task_id);
fprintf(stdout, " %3" PRId32 " %3" PRId32 " %s\n",
(rec->events >> RTEMS_CAPTURE_REAL_PRIORITY_EVENT) & 0xff,
(rec->events >> RTEMS_CAPTURE_CURR_PRIORITY_EVENT) & 0xff,
rtems_capture_event_text (e));
}
event >>= 1;
}
}
static void
rtems_caputre_cli_print_record_task(rtems_capture_record_t* rec)
{
rtems_capture_task_record_t* task_rec = (rtems_capture_task_record_t*) rec;
rtems_capture_cli_print_timestamp (rec->time);
fprintf (stdout, " ");
rtems_monitor_dump_id (rec->task_id);
fprintf (stdout, " %c%c%c%c",
(char) (task_rec->name >> 24) & 0xff,
(char) (task_rec->name >> 16) & 0xff,
(char) (task_rec->name >> 8) & 0xff,
(char) (task_rec->name >> 0) & 0xff);
fprintf (stdout, " %3" PRId32 " %3" PRId32 "\n",
task_rec->start_priority,
task_rec->stack_size);
}
/*
* rtems_capture_cli_count_tasks
@@ -355,7 +290,7 @@ rtems_capture_cli_task_list (int argc RC_UNUSED,
rtems_iterate_over_all_threads (rtems_capture_cli_count_tasks);
fprintf (stdout, "uptime: ");
rtems_capture_cli_print_timestamp (uptime);
rtems_capture_print_timestamp (uptime);
fprintf (stdout, "\ntotal %i\n", rtems_capture_cli_task_count);
rtems_iterate_over_all_threads (rtems_capture_cli_print_task);
}
@@ -375,79 +310,7 @@ rtems_capture_cli_watch_list (int argc RC_UNUSED,
const rtems_monitor_command_arg_t* command_arg RC_UNUSED,
bool verbose RC_UNUSED)
{
rtems_capture_control_t* control = rtems_capture_get_control_list ();
rtems_task_priority ceiling = rtems_capture_watch_get_ceiling ();
rtems_task_priority floor = rtems_capture_watch_get_floor ();
fprintf (stdout, "watch priority ceiling is %" PRId32 "\n", ceiling);
fprintf (stdout, "watch priority floor is %" PRId32 "\n", floor);
fprintf (stdout, "global watch is %s\n",
rtems_capture_watch_global_on () ? "enabled" : "disabled");
fprintf (stdout, "total %" PRId32 "\n", rtems_capture_control_count ());
while (control)
{
uint32_t flags;
int f;
int fshowed;
int lf;
fprintf (stdout, " ");
rtems_monitor_dump_id (rtems_capture_control_id (control));
fprintf (stdout, " ");
rtems_monitor_dump_name (rtems_capture_control_name (control));
flags = rtems_capture_control_flags (control);
fprintf (stdout, " %c%c ",
rtems_capture_watch_global_on () ? 'g' : '-',
flags & RTEMS_CAPTURE_WATCH ? 'w' : '-');
flags = rtems_capture_control_to_triggers (control);
fprintf (stdout, " T:%c%c%c%c%c%c%c",
flags & RTEMS_CAPTURE_SWITCH ? 'S' : '-',
flags & RTEMS_CAPTURE_CREATE ? 'C' : '-',
flags & RTEMS_CAPTURE_START ? 'S' : '-',
flags & RTEMS_CAPTURE_RESTART ? 'R' : '-',
flags & RTEMS_CAPTURE_DELETE ? 'D' : '-',
flags & RTEMS_CAPTURE_BEGIN ? 'B' : '-',
flags & RTEMS_CAPTURE_EXITTED ? 'E' : '-');
flags = rtems_capture_control_from_triggers (control);
fprintf (stdout, " F:%c%c%c%c%c",
flags & RTEMS_CAPTURE_SWITCH ? 'S' : '-',
flags & RTEMS_CAPTURE_CREATE ? 'C' : '-',
flags & RTEMS_CAPTURE_START ? 'S' : '-',
flags & RTEMS_CAPTURE_RESTART ? 'R' : '-',
flags & RTEMS_CAPTURE_DELETE ? 'D' : '-');
for (f = 0, fshowed = 0, lf = 1; f < RTEMS_CAPTURE_TRIGGER_TASKS; f++)
{
if (rtems_capture_control_by_valid (control, f))
{
if (lf && ((fshowed % 3) == 0))
{
fprintf (stdout, "\n");
lf = 0;
}
fprintf (stdout, " %2i:", f);
rtems_monitor_dump_name (rtems_capture_control_by_name (control, f));
fprintf (stdout, "/");
rtems_monitor_dump_id (rtems_capture_control_by_id (control, f));
flags = rtems_capture_control_by_triggers (control, f);
fprintf (stdout, ":%c%c%c%c%c",
flags & RTEMS_CAPTURE_SWITCH ? 'S' : '-',
flags & RTEMS_CAPTURE_CREATE ? 'C' : '-',
flags & RTEMS_CAPTURE_START ? 'S' : '-',
flags & RTEMS_CAPTURE_RESTART ? 'R' : '-',
flags & RTEMS_CAPTURE_DELETE ? 'D' : '-');
fshowed++;
lf = 1;
}
}
if (lf)
fprintf (stdout, "\n");
control = rtems_capture_next_control (control);
}
rtems_capture_print_watch_list();
}
/*
@@ -1154,16 +1017,9 @@ rtems_capture_cli_trace_records (int argc,
const rtems_monitor_command_arg_t* command_arg RC_UNUSED,
bool verbose RC_UNUSED)
{
rtems_status_code sc;
bool csv = false;
static int dump_total = 22;
int total;
int count;
uint32_t read;
rtems_capture_record_t* rec;
uint8_t* ptr;
int arg;
rtems_capture_time_t last_t = 0;
for (arg = 1; arg < argc; arg++)
{
@@ -1192,68 +1048,7 @@ rtems_capture_cli_trace_records (int argc,
}
}
total = dump_total;
while (total)
{
sc = rtems_capture_read (0, 0, &read, &rec);
if (sc != RTEMS_SUCCESSFUL)
{
fprintf (stdout, "error: trace read failed: %s\n", rtems_status_text (sc));
rtems_capture_flush (0);
return;
}
/*
* If we have no records then just exist. We still need to release
* the reader lock.
*/
if (read == 0)
{
rtems_capture_release (read);
break;
}
count = total < read ? total : read;
ptr = (uint8_t *) rec;
while (count--)
{
rec = (rtems_capture_record_t*) ptr;
if (csv)
fprintf (stdout, "%08" PRIu32 ",%03" PRIu32
",%03" PRIu32 ",%04" PRIx32 ",%" PRId64 "\n",
rec->task_id,
(rec->events >> RTEMS_CAPTURE_REAL_PRIORITY_EVENT) & 0xff,
(rec->events >> RTEMS_CAPTURE_CURR_PRIORITY_EVENT) & 0xff,
(rec->events >> RTEMS_CAPTURE_EVENT_START),
(uint64_t) rec->time);
else {
if ((rec->events >> RTEMS_CAPTURE_EVENT_START) == 0)
rtems_caputre_cli_print_record_task( rec );
else {
uint64_t diff = 0;
if (last_t)
diff = rec->time - last_t;
last_t = rec->time;
rtems_caputure_cli_print_record_std( rec, diff );
}
}
ptr += rec->size;
}
count = total < read ? total : read;
if (count < total)
total -= count;
else
total = 0;
rtems_capture_release (count);
}
rtems_capture_print_trace_records( dump_total, csv );
}
/*