Skip to content

Commit

Permalink
Debugger: Add signal settings and listener hooks.
Browse files Browse the repository at this point in the history
Team:
- Add settings and accessors for signal dispositions.
- Add event definitions and listener hooks for signal disposition
  changes.
  • Loading branch information
anevilyak committed Jul 3, 2015
1 parent 8e5da92 commit 14a55dc
Show file tree
Hide file tree
Showing 6 changed files with 306 additions and 2 deletions.
3 changes: 3 additions & 0 deletions src/apps/debugger/MessageCodes.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,9 @@ enum {
MSG_STOP_ON_IMAGE_LOAD = 'tsil',
MSG_ADD_STOP_IMAGE_NAME = 'asin',
MSG_REMOVE_STOP_IMAGE_NAME = 'rsin',
MSG_SET_DEFAULT_SIGNAL_DISPOSITION = 'sdsd',
MSG_SET_CUSTOM_SIGNAL_DISPOSITION = 'scsd',
MSG_REMOVE_CUSTOM_SIGNAL_DISPOSITION = 'rcsd',

MSG_THREAD_STATE_CHANGED = 'tsch',
MSG_THREAD_CPU_STATE_CHANGED = 'tcsc',
Expand Down
66 changes: 66 additions & 0 deletions src/apps/debugger/controllers/TeamDebugger.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -685,6 +685,43 @@ TeamDebugger::MessageReceived(BMessage* message)

AutoLocker< ::Team> teamLocker(fTeam);
fTeam->RemoveStopImageName(imageName);
break;
}

case MSG_SET_DEFAULT_SIGNAL_DISPOSITION:
{
int32 disposition;
if (message->FindInt32("disposition", &disposition) != B_OK)
break;

AutoLocker< ::Team> teamLocker(fTeam);
fTeam->SetDefaultSignalDisposition(disposition);
break;
}

case MSG_SET_CUSTOM_SIGNAL_DISPOSITION:
{
int32 signal;
int32 disposition;
if (message->FindInt32("signal", &signal) != B_OK
|| message->FindInt32("disposition", &disposition) != B_OK) {
break;
}

AutoLocker< ::Team> teamLocker(fTeam);
fTeam->SetCustomSignalDisposition(signal, disposition);
break;
}

case MSG_REMOVE_CUSTOM_SIGNAL_DISPOSITION:
{
int32 signal;
if (message->FindInt32("signal", &signal) != B_OK)
break;

AutoLocker< ::Team> teamLocker(fTeam);
fTeam->RemoveCustomSignalDisposition(signal);
break;
}

case MSG_SET_WATCHPOINT:
Expand Down Expand Up @@ -1105,6 +1142,35 @@ TeamDebugger::RemoveStopImageNameRequested(const char* name)
}


void
TeamDebugger::SetDefaultSignalDispositionRequested(int32 disposition)
{
BMessage message(MSG_SET_DEFAULT_SIGNAL_DISPOSITION);
message.AddInt32("disposition", disposition);
PostMessage(&message);
}


void
TeamDebugger::SetCustomSignalDispositionRequested(int32 signal,
int32 disposition)
{
BMessage message(MSG_SET_CUSTOM_SIGNAL_DISPOSITION);
message.AddInt32("signal", signal);
message.AddInt32("disposition", disposition);
PostMessage(&message);
}


void
TeamDebugger::RemoveCustomSignalDispositionRequested(int32 signal)
{
BMessage message(MSG_REMOVE_CUSTOM_SIGNAL_DISPOSITION);
message.AddInt32("signal", signal);
PostMessage(&message);
}


void
TeamDebugger::ClearBreakpointRequested(UserBreakpoint* breakpoint)
{
Expand Down
7 changes: 7 additions & 0 deletions src/apps/debugger/controllers/TeamDebugger.h
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,13 @@ class TeamDebugger : public BLooper, private UserInterfaceListener,
virtual void RemoveStopImageNameRequested(
const char* name);

virtual void SetDefaultSignalDispositionRequested(
int32 disposition);
virtual void SetCustomSignalDispositionRequested(
int32 signal, int32 disposition);
virtual void RemoveCustomSignalDispositionRequested(
int32 signal);

virtual void SetWatchpointRequested(target_addr_t address,
uint32 type, int32 length, bool enabled);
virtual void SetWatchpointEnabledRequested(
Expand Down
152 changes: 151 additions & 1 deletion src/apps/debugger/model/Team.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
#include "FileSourceCode.h"
#include "Function.h"
#include "ImageDebugInfo.h"
#include "SignalDispositionTypes.h"
#include "SourceCode.h"
#include "SpecificImageDebugInfo.h"
#include "Statement.h"
Expand Down Expand Up @@ -80,7 +81,8 @@ Team::Team(team_id teamID, TeamMemory* teamMemory, Architecture* architecture,
fArchitecture(architecture),
fDebugInfo(debugInfo),
fStopOnImageLoad(false),
fStopImageNameListEnabled(false)
fStopImageNameListEnabled(false),
fDefaultSignalDisposition(SIGNAL_DISPOSITION_IGNORE)
{
fDebugInfo->AcquireReference();
}
Expand Down Expand Up @@ -312,6 +314,69 @@ Team::StopImageNames() const
}


void
Team::SetDefaultSignalDisposition(int32 disposition)
{
if (disposition != fDefaultSignalDisposition) {
fDefaultSignalDisposition = disposition;
NotifyDefaultSignalDispositionChanged(disposition);
}
}


bool
Team::SetCustomSignalDisposition(int32 signal, int32 disposition)
{
SignalDispositionMappings::iterator it = fCustomSignalDispositions.find(
signal);
if (it != fCustomSignalDispositions.end() && it->second == disposition)
return true;

try {
fCustomSignalDispositions[signal] = disposition;
} catch (...) {
return false;
}

NotifyCustomSignalDispositionChanged(signal, disposition);

return true;
}


void
Team::RemoveCustomSignalDisposition(int32 signal)
{
SignalDispositionMappings::iterator it = fCustomSignalDispositions.find(
signal);
if (it == fCustomSignalDispositions.end())
return;

fCustomSignalDispositions.erase(it);

NotifyCustomSignalDispositionRemoved(signal);
}


int32
Team::SignalDispositionFor(int32 signal) const
{
SignalDispositionMappings::const_iterator it
= fCustomSignalDispositions.find(signal);
if (it != fCustomSignalDispositions.end())
return it->second;

return fDefaultSignalDisposition;
}


const SignalDispositionMappings&
Team::GetSignalDispositionMappings() const
{
return fCustomSignalDispositions;
}


bool
Team::AddBreakpoint(Breakpoint* breakpoint)
{
Expand Down Expand Up @@ -687,6 +752,45 @@ Team::NotifyStopImageNameRemoved(const BString& name)
}


void
Team::NotifyDefaultSignalDispositionChanged(int32 disposition)
{
for (ListenerList::Iterator it = fListeners.GetIterator();
Listener* listener = it.Next();) {
listener->DefaultSignalDispositionChanged(
DefaultSignalDispositionEvent(
TEAM_EVENT_DEFAULT_SIGNAL_DISPOSITION_CHANGED, this,
disposition));
}
}


void
Team::NotifyCustomSignalDispositionChanged(int32 signal, int32 disposition)
{
for (ListenerList::Iterator it = fListeners.GetIterator();
Listener* listener = it.Next();) {
listener->CustomSignalDispositionChanged(
CustomSignalDispositionEvent(
TEAM_EVENT_CUSTOM_SIGNAL_DISPOSITION_CHANGED, this,
signal, disposition));
}
}


void
Team::NotifyCustomSignalDispositionRemoved(int32 signal)
{
for (ListenerList::Iterator it = fListeners.GetIterator();
Listener* listener = it.Next();) {
listener->CustomSignalDispositionRemoved(
CustomSignalDispositionEvent(
TEAM_EVENT_CUSTOM_SIGNAL_DISPOSITION_REMOVED, this,
signal, SIGNAL_DISPOSITION_IGNORE));
}
}


void
Team::NotifyConsoleOutputReceived(int32 fd, const BString& output)
{
Expand Down Expand Up @@ -841,6 +945,31 @@ Team::ImageLoadNameEvent::ImageLoadNameEvent(uint32 type, Team* team,
}


// #pragma mark - DefaultSignalDispositionEvent


Team::DefaultSignalDispositionEvent::DefaultSignalDispositionEvent(uint32 type,
Team* team, int32 disposition)
:
Event(type, team),
fDefaultDisposition(disposition)
{
}


// #pragma mark - CustomSignalDispositionEvent


Team::CustomSignalDispositionEvent::CustomSignalDispositionEvent(uint32 type,
Team* team, int32 signal, int32 disposition)
:
Event(type, team),
fSignal(signal),
fDisposition(disposition)
{
}


// #pragma mark - BreakpointEvent


Expand Down Expand Up @@ -991,6 +1120,27 @@ Team::Listener::StopOnImageLoadNameRemoved(
}


void
Team::Listener::DefaultSignalDispositionChanged(
const Team::DefaultSignalDispositionEvent& event)
{
}


void
Team::Listener::CustomSignalDispositionChanged(
const Team::CustomSignalDispositionEvent& event)
{
}


void
Team::Listener::CustomSignalDispositionRemoved(
const Team::CustomSignalDispositionEvent& event)
{
}


void
Team::Listener::ConsoleOutputReceived(const Team::ConsoleOutputEvent& event)
{
Expand Down

0 comments on commit 14a55dc

Please sign in to comment.