trace: use new trace frontend in test-trace

This commit is contained in:
Josef Söntgen 2013-09-19 16:32:31 +02:00 committed by Norman Feske
parent 8b69d91c05
commit 35118f0a32

View File

@ -62,46 +62,19 @@ class Trace_buffer_monitor
private: private:
enum { MAX_ENTRY_BUF = 256 }; enum { MAX_ENTRY_BUF = 256 };
char _buf[MAX_ENTRY_BUF];
Trace::Subject_id _id; Trace::Subject_id _id;
Trace::Buffer *_buffer; Trace::Buffer *_buffer;
Trace::Buffer::Entry _curr_entry;
addr_t _read_head; const char *_terminate_entry(Trace::Buffer::Entry const &entry)
addr_t _write_head;
size_t _overflow;
char _entry_buf[MAX_ENTRY_BUF];
const char * _next_entry()
{ {
size_t len = *(addr_t*) _read_head; size_t len = min(entry.length() + 1, MAX_ENTRY_BUF);
char *p = (char*) _read_head; memcpy(_buf, entry.data(), len);
_buf[len-1] = '\0';
char tmp[len + 1]; return _buf;
p += sizeof(size_t);
if (len > 0)
memcpy(tmp, (void *)(p), len); tmp[len] = '\0';
_read_head = (addr_t)(p + len);
snprintf(_entry_buf, MAX_ENTRY_BUF, "0x%lx '%s'",
_read_head, tmp);
return _entry_buf;
}
void _update_heads()
{
_write_head = _buffer->entries();
_write_head += _buffer->head_offset();
if (_write_head < _read_head) {
_overflow++;
/* XXX read missing entries before resetting */
_read_head = _buffer->entries();
}
} }
public: public:
@ -110,12 +83,9 @@ class Trace_buffer_monitor
: :
_id(id), _id(id),
_buffer(env()->rm_session()->attach(ds_cap)), _buffer(env()->rm_session()->attach(ds_cap)),
_read_head(_buffer->entries()), _curr_entry(_buffer->first())
_write_head(_buffer->entries() + _buffer->head_offset()),
_overflow(0)
{ {
PLOG("monitor subject:%d buffer:0x%lx start:0x%lx", PLOG("monitor subject:%d buffer:0x%lx", _id.id, (addr_t)_buffer);
_id.id, (addr_t)_buffer, _buffer->entries());
} }
~Trace_buffer_monitor() ~Trace_buffer_monitor()
@ -126,26 +96,23 @@ class Trace_buffer_monitor
Trace::Subject_id id() { return _id; }; Trace::Subject_id id() { return _id; };
void dump(unsigned limit) void dump()
{ {
_update_heads(); PLOG("overflows: %u", _buffer->wrapped());
PLOG("overflows: %zu", _overflow);
if (limit) { PLOG("read all remaining events");
PLOG("read up-to %u events", limit); for (; !_curr_entry.is_last(); _curr_entry = _buffer->next(_curr_entry)) {
for (unsigned i = 0; i < limit; i++) { /* omit empty entries */
const char *s = _next_entry(); if (_curr_entry.length() == 0)
if (s) continue;
PLOG("%s", s);
} const char *data = _terminate_entry(_curr_entry);
} else { if (data)
PLOG("read all remaining events"); PLOG("%s", data);
while (_read_head < _write_head) {
const char *s = _next_entry();
if (s)
PLOG("%s", s);
}
} }
/* reset after we read all available entries */
_curr_entry = _buffer->first();
} }
}; };
@ -245,7 +212,7 @@ int main(int argc, char **argv)
/* read events from trace buffer */ /* read events from trace buffer */
if (test_monitor) { if (test_monitor) {
if (subjects[i].id == test_monitor->id().id) if (subjects[i].id == test_monitor->id().id)
test_monitor->dump(0); test_monitor->dump();
} }
} }
} }