Add code to make sure InputReaders finish and are cleaned up when

a Debugger object is destroyed or re-set. (Thus making sure that, for
example, the Python interpreter finishes and exits cleanly rather than
being left in an undefined state.)

llvm-svn: 122255
This commit is contained in:
Caroline Tice 2010-12-20 18:35:50 +00:00
parent 64c2c5798a
commit 3d6086f628
3 changed files with 25 additions and 0 deletions

View File

@ -372,6 +372,9 @@ public:
const char **end); const char **end);
void
CleanUpInputReaders ();
protected: protected:
static void static void

View File

@ -59,6 +59,9 @@ SBDebugger::Clear ()
if (log) if (log)
log->Printf ("SBDebugger(%p)::Clear ()", m_opaque_sp.get()); log->Printf ("SBDebugger(%p)::Clear ()", m_opaque_sp.get());
if (m_opaque_sp)
m_opaque_sp->CleanUpInputReaders ();
m_opaque_sp.reset(); m_opaque_sp.reset();
} }

View File

@ -184,6 +184,7 @@ Debugger::Debugger () :
Debugger::~Debugger () Debugger::~Debugger ()
{ {
CleanUpInputReaders();
int num_targets = m_target_list.GetNumTargets(); int num_targets = m_target_list.GetNumTargets();
for (int i = 0; i < num_targets; i++) for (int i = 0; i < num_targets; i++)
{ {
@ -389,6 +390,24 @@ Debugger::DispatchInputEndOfFile ()
} }
} }
void
Debugger::CleanUpInputReaders ()
{
m_input_reader_data.clear();
while (m_input_readers.size() > 1)
{
while (CheckIfTopInputReaderIsDone ()) ;
InputReaderSP reader_sp (m_input_readers.top());
if (reader_sp)
{
reader_sp->Notify (eInputReaderEndOfFile);
reader_sp->SetIsDone (true);
}
}
}
void void
Debugger::WriteToDefaultReader (const char *bytes, size_t bytes_len) Debugger::WriteToDefaultReader (const char *bytes, size_t bytes_len)
{ {