* Although it takes a bit of memory, the Model also stores an array with
pointers to all events now. This allows for backward iteration. * Model::ThreadWaitObjectGroup: Added a few convenience getters. * Added functions thread_state_name() and wait_object_type_name() to translate a ThreadState respectively a wait object type into a readable string. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34588 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -160,6 +160,16 @@ ModelLoader::_Load()
|
||||
status_t error = _ReadDebugEvents(&eventData, &eventDataSize);
|
||||
if (error != B_OK)
|
||||
return error;
|
||||
MemoryDeleter eventDataDeleter(eventData);
|
||||
|
||||
// create a debug event array
|
||||
system_profiler_event_header** events;
|
||||
size_t eventCount;
|
||||
error = _CreateDebugEventArray(eventData, eventDataSize, events,
|
||||
eventCount);
|
||||
if (error != B_OK)
|
||||
return error;
|
||||
ArrayDeleter<system_profiler_event_header*> eventsDeleter(events);
|
||||
|
||||
// get the data source name
|
||||
BString dataSourceName;
|
||||
@@ -167,19 +177,15 @@ ModelLoader::_Load()
|
||||
|
||||
// create a model
|
||||
fModel = new(std::nothrow) Model(dataSourceName.String(), eventData,
|
||||
eventDataSize);
|
||||
if (fModel == NULL) {
|
||||
free(eventData);
|
||||
eventDataSize, events, eventCount);
|
||||
if (fModel == NULL)
|
||||
return B_NO_MEMORY;
|
||||
}
|
||||
eventDataDeleter.Detach();
|
||||
eventsDeleter.Detach();
|
||||
|
||||
// create a debug input stream
|
||||
BDebugEventInputStream* input = new(std::nothrow) BDebugEventInputStream;
|
||||
if (input == NULL)
|
||||
return B_NO_MEMORY;
|
||||
ObjectDeleter<BDebugEventInputStream> inputDeleter(input);
|
||||
|
||||
error = input->SetTo(eventData, eventDataSize, false);
|
||||
BDebugEventInputStream input;
|
||||
error = input.SetTo(eventData, eventDataSize, false);
|
||||
if (error != B_OK)
|
||||
return error;
|
||||
|
||||
@@ -201,7 +207,7 @@ ModelLoader::_Load()
|
||||
uint32 cpu;
|
||||
const void* buffer;
|
||||
off_t offset;
|
||||
ssize_t bufferSize = input->ReadNextEvent(&event, &cpu, &buffer,
|
||||
ssize_t bufferSize = input.ReadNextEvent(&event, &cpu, &buffer,
|
||||
&offset);
|
||||
if (bufferSize < 0)
|
||||
return bufferSize;
|
||||
@@ -320,6 +326,65 @@ ModelLoader::_ReadDebugEvents(void** _eventData, size_t* _size)
|
||||
}
|
||||
|
||||
|
||||
status_t
|
||||
ModelLoader::_CreateDebugEventArray(void* eventData, size_t eventDataSize,
|
||||
system_profiler_event_header**& _events, size_t& _eventCount)
|
||||
{
|
||||
// count the events
|
||||
BDebugEventInputStream input;
|
||||
status_t error = input.SetTo(eventData, eventDataSize, false);
|
||||
if (error != B_OK)
|
||||
return error;
|
||||
|
||||
size_t eventCount = 0;
|
||||
while (true) {
|
||||
// get next event
|
||||
uint32 event;
|
||||
uint32 cpu;
|
||||
const void* buffer;
|
||||
ssize_t bufferSize = input.ReadNextEvent(&event, &cpu, &buffer, NULL);
|
||||
if (bufferSize < 0)
|
||||
return bufferSize;
|
||||
if (buffer == NULL)
|
||||
break;
|
||||
|
||||
eventCount++;
|
||||
}
|
||||
|
||||
// create the array
|
||||
system_profiler_event_header** events = new(std::nothrow)
|
||||
system_profiler_event_header*[eventCount];
|
||||
if (events == NULL)
|
||||
return B_NO_MEMORY;
|
||||
|
||||
// populate the array
|
||||
error = input.SetTo(eventData, eventDataSize, false);
|
||||
if (error != B_OK) {
|
||||
delete[] events;
|
||||
return error;
|
||||
}
|
||||
|
||||
size_t eventIndex = 0;
|
||||
while (true) {
|
||||
// get next event
|
||||
uint32 event;
|
||||
uint32 cpu;
|
||||
const void* buffer;
|
||||
off_t offset;
|
||||
input.ReadNextEvent(&event, &cpu, &buffer, &offset);
|
||||
if (buffer == NULL)
|
||||
break;
|
||||
|
||||
events[eventIndex++]
|
||||
= (system_profiler_event_header*)((uint8*)eventData + offset);
|
||||
}
|
||||
|
||||
_events = events;
|
||||
_eventCount = eventCount;
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
|
||||
status_t
|
||||
ModelLoader::_ProcessEvent(uint32 event, uint32 cpu, const void* buffer,
|
||||
size_t size)
|
||||
|
||||
Reference in New Issue
Block a user