Files
haiku-beta6/src/apps/debugger/model/Team.cpp
T
Ingo Weinhold 93b6484548 * Added support for loading the debug info for an image lazily and adjusted
the jobs accordingly.
* Added a view to list the source files and functions for an image.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@31271 a95241bf-73f2-0310-859d-f6bbb57e9c96
2009-06-27 16:49:55 +00:00

391 lines
5.9 KiB
C++

/*
* Copyright 2009, Ingo Weinhold, [email protected].
* Distributed under the terms of the MIT License.
*/
#include "Team.h"
#include <new>
#include <AutoLocker.h>
// #pragma mark - Team
Team::Team(team_id teamID)
:
fID(teamID)
{
}
Team::~Team()
{
while (Image* image = fImages.RemoveHead())
image->RemoveReference();
while (Thread* thread = fThreads.RemoveHead())
thread->RemoveReference();
}
status_t
Team::Init()
{
return BLocker::InitCheck();
}
void
Team::SetName(const BString& name)
{
fName = name;
}
void
Team::AddThread(Thread* thread)
{
fThreads.Add(thread);
_NotifyThreadAdded(thread);
}
status_t
Team::AddThread(const ThreadInfo& threadInfo, Thread** _thread)
{
Thread* thread = new(std::nothrow) Thread(this, threadInfo.ThreadID());
if (thread == NULL)
return B_NO_MEMORY;
status_t error = thread->Init();
if (error != B_OK) {
delete thread;
return error;
}
thread->SetName(threadInfo.Name());
AddThread(thread);
if (_thread != NULL)
*_thread = thread;
return B_OK;
}
void
Team::RemoveThread(Thread* thread)
{
fThreads.Remove(thread);
_NotifyThreadRemoved(thread);
}
bool
Team::RemoveThread(thread_id threadID)
{
Thread* thread = ThreadByID(threadID);
if (thread == NULL)
return false;
RemoveThread(thread);
thread->RemoveReference();
return true;
}
Thread*
Team::ThreadByID(thread_id threadID) const
{
for (ThreadList::ConstIterator it = fThreads.GetIterator();
Thread* thread = it.Next();) {
if (thread->ID() == threadID)
return thread;
}
return NULL;
}
const ThreadList&
Team::Threads() const
{
return fThreads;
}
void
Team::AddImage(Image* image)
{
fImages.Add(image);
_NotifyImageAdded(image);
}
status_t
Team::AddImage(const ImageInfo& imageInfo, Image** _image)
{
Image* image = new(std::nothrow) Image(this, imageInfo);
if (image == NULL)
return B_NO_MEMORY;
status_t error = image->Init();
if (error != B_OK) {
delete image;
return error;
}
AddImage(image);
if (_image != NULL)
*_image = image;
return B_OK;
}
void
Team::RemoveImage(Image* image)
{
fImages.Remove(image);
_NotifyImageRemoved(image);
}
bool
Team::RemoveImage(image_id imageID)
{
Image* image = ImageByID(imageID);
if (image == NULL)
return false;
RemoveImage(image);
image->RemoveReference();
return true;
}
Image*
Team::ImageByID(image_id imageID) const
{
for (ImageList::ConstIterator it = fImages.GetIterator();
Image* image = it.Next();) {
if (image->ID() == imageID)
return image;
}
return NULL;
}
Image*
Team::ImageByAddress(target_addr_t address) const
{
for (ImageList::ConstIterator it = fImages.GetIterator();
Image* image = it.Next();) {
if (image->ContainsAddress(address))
return image;
}
return NULL;
}
const ImageList&
Team::Images() const
{
return fImages;
}
void
Team::AddListener(Listener* listener)
{
AutoLocker<Team> locker(this);
fListeners.Add(listener);
}
void
Team::RemoveListener(Listener* listener)
{
AutoLocker<Team> locker(this);
fListeners.Remove(listener);
}
void
Team::NotifyThreadStateChanged(Thread* thread)
{
for (ListenerList::Iterator it = fListeners.GetIterator();
Listener* listener = it.Next();) {
listener->ThreadStateChanged(
ThreadEvent(TEAM_EVENT_THREAD_STATE_CHANGED, thread));
}
}
void
Team::NotifyThreadCpuStateChanged(Thread* thread)
{
for (ListenerList::Iterator it = fListeners.GetIterator();
Listener* listener = it.Next();) {
listener->ThreadCpuStateChanged(
ThreadEvent(TEAM_EVENT_THREAD_CPU_STATE_CHANGED, thread));
}
}
void
Team::NotifyThreadStackTraceChanged(Thread* thread)
{
for (ListenerList::Iterator it = fListeners.GetIterator();
Listener* listener = it.Next();) {
listener->ThreadStackTraceChanged(
ThreadEvent(TEAM_EVENT_THREAD_STACK_TRACE_CHANGED, thread));
}
}
void
Team::NotifyImageDebugInfoChanged(Image* image)
{
for (ListenerList::Iterator it = fListeners.GetIterator();
Listener* listener = it.Next();) {
listener->ImageDebugInfoChanged(
ImageEvent(TEAM_EVENT_IMAGE_DEBUG_INFO_CHANGED, image));
}
}
void
Team::_NotifyThreadAdded(Thread* thread)
{
for (ListenerList::Iterator it = fListeners.GetIterator();
Listener* listener = it.Next();) {
listener->ThreadAdded(ThreadEvent(TEAM_EVENT_THREAD_ADDED, thread));
}
}
void
Team::_NotifyThreadRemoved(Thread* thread)
{
for (ListenerList::Iterator it = fListeners.GetIterator();
Listener* listener = it.Next();) {
listener->ThreadRemoved(ThreadEvent(TEAM_EVENT_THREAD_REMOVED, thread));
}
}
void
Team::_NotifyImageAdded(Image* image)
{
for (ListenerList::Iterator it = fListeners.GetIterator();
Listener* listener = it.Next();) {
listener->ImageAdded(ImageEvent(TEAM_EVENT_IMAGE_ADDED, image));
}
}
void
Team::_NotifyImageRemoved(Image* image)
{
for (ListenerList::Iterator it = fListeners.GetIterator();
Listener* listener = it.Next();) {
listener->ImageRemoved(ImageEvent(TEAM_EVENT_IMAGE_REMOVED, image));
}
}
// #pragma mark - Event
Team::Event::Event(uint32 type, Team* team)
:
fEventType(type),
fTeam(team)
{
}
// #pragma mark - ThreadEvent
Team::ThreadEvent::ThreadEvent(uint32 type, Thread* thread)
:
Event(type, thread->GetTeam()),
fThread(thread)
{
}
// #pragma mark - ImageEvent
Team::ImageEvent::ImageEvent(uint32 type, Image* image)
:
Event(type, image->GetTeam()),
fImage(image)
{
}
// #pragma mark - Listener
Team::Listener::~Listener()
{
}
void
Team::Listener::ThreadAdded(const Team::ThreadEvent& event)
{
}
void
Team::Listener::ThreadRemoved(const Team::ThreadEvent& event)
{
}
void
Team::Listener::ImageAdded(const Team::ImageEvent& event)
{
}
void
Team::Listener::ImageRemoved(const Team::ImageEvent& event)
{
}
void
Team::Listener::ThreadStateChanged(const Team::ThreadEvent& event)
{
}
void
Team::Listener::ThreadCpuStateChanged(const Team::ThreadEvent& event)
{
}
void
Team::Listener::ThreadStackTraceChanged(const Team::ThreadEvent& event)
{
}
void
Team::Listener::ImageDebugInfoChanged(const Team::ImageEvent& event)
{
}