diff --git a/headers/private/kernel/tracing.h b/headers/private/kernel/tracing.h index cdecda0d2d..da187b0681 100644 --- a/headers/private/kernel/tracing.h +++ b/headers/private/kernel/tracing.h @@ -20,6 +20,19 @@ struct trace_entry { #include +class TraceOutput { + public: + TraceOutput(char* buffer, size_t bufferSize); + + void Print(const char* format,...); + bool IsFull() const { return fSize >= fCapacity; } + + private: + char* fBuffer; + size_t fCapacity; + size_t fSize; +}; + class TraceEntry : trace_entry { public: TraceEntry(); @@ -44,16 +57,12 @@ class AbstractTraceEntry : public TraceEntry { { } - virtual void Dump(char* buffer, size_t bufferSize) - { - int length = snprintf(buffer, bufferSize, "[%6ld] %Ld: ", - fThread, fTime); - AddDump(buffer + length, bufferSize - length); - } + virtual ~AbstractTraceEntry(); - virtual void AddDump(char* buffer, size_t bufferSize) - { - } + virtual void Dump(char* buffer, size_t bufferSize); + + virtual void AddDump(char* buffer, size_t bufferSize); + virtual void AddDump(TraceOutput& out); thread_id Thread() const { return fThread; } bigtime_t Time() const { return fTime; } diff --git a/src/system/kernel/debug/tracing.cpp b/src/system/kernel/debug/tracing.cpp index 48ab3c224f..b1a6f878b4 100644 --- a/src/system/kernel/debug/tracing.cpp +++ b/src/system/kernel/debug/tracing.cpp @@ -7,6 +7,7 @@ #include +#include #include #include @@ -140,6 +141,30 @@ allocate_entry(size_t size, uint16 flags) #endif // ENABLE_TRACING +// #pragma mark - + + +TraceOutput::TraceOutput(char* buffer, size_t bufferSize) + : fBuffer(buffer), + fCapacity(bufferSize), + fSize(0) +{ +} + + +void +TraceOutput::Print(const char* format,...) +{ + if (IsFull()) + return; + + va_list args; + va_start(args, format); + fSize += vsnprintf(fBuffer + fSize, fCapacity - fSize, format, args); + va_end(args); +} + + // #pragma mark - @@ -157,8 +182,8 @@ void TraceEntry::Dump(char* buffer, size_t bufferSize) { #if ENABLE_TRACING - // to be overloaded by subclasses - snprintf(buffer, bufferSize, "ENTRY %p", this); + // to be overridden by subclasses + kprintf(buffer, bufferSize, "ENTRY %p", this); #endif } @@ -187,6 +212,37 @@ TraceEntry::operator new(size_t size, const std::nothrow_t&) throw() // #pragma mark - +AbstractTraceEntry::~AbstractTraceEntry() +{ +} + + +void +AbstractTraceEntry::Dump(char* buffer, size_t bufferSize) +{ + int length = snprintf(buffer, bufferSize, "[%6ld] %Ld: ", + fThread, fTime); + AddDump(buffer + length, bufferSize - length); +} + + +void +AbstractTraceEntry::AddDump(char* buffer, size_t bufferSize) +{ + TraceOutput out(buffer, bufferSize); + AddDump(out); +} + + +void +AbstractTraceEntry::AddDump(TraceOutput& out) +{ +} + + +// #pragma mark - + + #if ENABLE_TRACING