Added BDebugEventInputStream::SetTo() for initializing with a memory buffer.

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@30295 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Ingo Weinhold
2009-04-21 15:29:11 +00:00
parent bc2e00c1c7
commit 0b6cffb656
2 changed files with 87 additions and 32 deletions
+4
View File
@@ -40,12 +40,15 @@ public:
~BDebugEventInputStream(); ~BDebugEventInputStream();
status_t SetTo(BDataIO* stream); status_t SetTo(BDataIO* stream);
status_t SetTo(const void* data, size_t size,
bool takeOverOwnership);
void Unset(); void Unset();
ssize_t ReadNextEvent(uint32* _event, uint32* _cpu, ssize_t ReadNextEvent(uint32* _event, uint32* _cpu,
const void** _buffer); const void** _buffer);
private: private:
status_t _Init();
ssize_t _Read(void* buffer, size_t size); ssize_t _Read(void* buffer, size_t size);
status_t _GetData(size_t size); status_t _GetData(size_t size);
@@ -57,6 +60,7 @@ private:
size_t fBufferCapacity; size_t fBufferCapacity;
size_t fBufferSize; size_t fBufferSize;
size_t fBufferPosition; size_t fBufferPosition;
bool fOwnsBuffer;
}; };
+83 -32
View File
@@ -24,7 +24,8 @@ BDebugEventInputStream::BDebugEventInputStream()
fBuffer(NULL), fBuffer(NULL),
fBufferCapacity(0), fBufferCapacity(0),
fBufferSize(0), fBufferSize(0),
fBufferPosition(0) fBufferPosition(0),
fOwnsBuffer(false)
{ {
} }
@@ -33,7 +34,8 @@ BDebugEventInputStream::~BDebugEventInputStream()
{ {
Unset(); Unset();
free(fBuffer); if (fOwnsBuffer)
free(fBuffer);
} }
@@ -56,38 +58,37 @@ BDebugEventInputStream::SetTo(BDataIO* stream)
return B_NO_MEMORY; return B_NO_MEMORY;
} }
fOwnsBuffer = true;
fBufferCapacity = INPUT_BUFFER_SIZE; fBufferCapacity = INPUT_BUFFER_SIZE;
fBufferSize = 0; fBufferSize = 0;
} }
fBufferPosition = 0; return _Init();
}
// read the header
debug_event_stream_header header; status_t
ssize_t bytesRead = _Read(&header, sizeof(header)); BDebugEventInputStream::SetTo(const void* data, size_t size,
if (bytesRead < 0) { bool takeOverOwnership)
Unset(); {
return bytesRead; Unset();
}
if ((size_t)bytesRead != sizeof(header)) { if (data == NULL || size == 0)
Unset(); return B_BAD_VALUE;
return B_BAD_DATA;
if (fBuffer != NULL) {
if (fOwnsBuffer)
free(fBuffer);
fBuffer = NULL;
fBufferCapacity = 0;
fBufferSize = 0;
} }
// check the header fBuffer = (uint8*)data;
if (strncmp(header.signature, B_DEBUG_EVENT_STREAM_SIGNATURE, fBufferCapacity = fBufferSize = size;
sizeof(header.signature)) != 0 fOwnsBuffer = takeOverOwnership;
|| header.version != B_DEBUG_EVENT_STREAM_VERSION
|| (header.flags & B_DEBUG_EVENT_STREAM_FLAG_HOST_ENDIAN) == 0) {
// TODO: Support non-host endianess!
Unset();
return B_BAD_DATA;
}
fFlags = header.flags; return _Init();
fEventMask = header.event_mask;
return B_OK;
} }
@@ -97,6 +98,20 @@ BDebugEventInputStream::Unset()
fStream = NULL; fStream = NULL;
fFlags = 0; fFlags = 0;
fEventMask = 0; fEventMask = 0;
// If we have a buffer that we own and has the right size, we keep it.
if (fOwnsBuffer) {
if (fBuffer != NULL && fBufferSize != INPUT_BUFFER_SIZE) {
free(fBuffer);
fBuffer = NULL;
fBufferCapacity = 0;
fBufferSize = 0;
}
} else {
fBuffer = NULL;
fBufferCapacity = 0;
fBufferSize = 0;
}
} }
@@ -155,6 +170,40 @@ BDebugEventInputStream::ReadNextEvent(uint32* _event, uint32* _cpu,
} }
status_t
BDebugEventInputStream::_Init()
{
fBufferPosition = 0;
// get the header
status_t error = _GetData(sizeof(debug_event_stream_header));
if (error != B_OK) {
Unset();
return error;
}
const debug_event_stream_header& header
= *(const debug_event_stream_header*)(fBuffer + fBufferPosition);
fBufferPosition += sizeof(debug_event_stream_header);
fBufferSize -= sizeof(debug_event_stream_header);
// check the header
if (strncmp(header.signature, B_DEBUG_EVENT_STREAM_SIGNATURE,
sizeof(header.signature)) != 0
|| header.version != B_DEBUG_EVENT_STREAM_VERSION
|| (header.flags & B_DEBUG_EVENT_STREAM_FLAG_HOST_ENDIAN) == 0) {
// TODO: Support non-host endianess!
Unset();
return B_BAD_DATA;
}
fFlags = header.flags;
fEventMask = header.event_mask;
return B_OK;
}
ssize_t ssize_t
BDebugEventInputStream::_Read(void* _buffer, size_t size) BDebugEventInputStream::_Read(void* _buffer, size_t size)
{ {
@@ -190,12 +239,14 @@ BDebugEventInputStream::_GetData(size_t size)
fBufferPosition = 0; fBufferPosition = 0;
// read more data // read more data
ssize_t bytesRead = _Read(fBuffer + fBufferSize, if (fStream != NULL) {
fBufferCapacity - fBufferSize); ssize_t bytesRead = _Read(fBuffer + fBufferSize,
if (bytesRead < 0) fBufferCapacity - fBufferSize);
return bytesRead; if (bytesRead < 0)
return bytesRead;
fBufferSize += bytesRead;
fBufferSize += bytesRead;
}
return fBufferSize >= size ? B_OK : B_BAD_DATA; return fBufferSize >= size ? B_OK : B_BAD_DATA;
} }