diff options
author | Caroline Tice <ctice@apple.com> | 2010-12-20 18:35:50 +0000 |
---|---|---|
committer | Caroline Tice <ctice@apple.com> | 2010-12-20 18:35:50 +0000 |
commit | 3d6086f628fd49b4592b5749c44e9733890d6997 (patch) | |
tree | b09c2628f8a5b90514742a32d5214f5b353d9e68 | |
parent | 64c2c5798a3533e6c86bc91d8c2884c36649cae5 (diff) | |
download | bcm5719-llvm-3d6086f628fd49b4592b5749c44e9733890d6997.tar.gz bcm5719-llvm-3d6086f628fd49b4592b5749c44e9733890d6997.zip |
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
-rw-r--r-- | lldb/include/lldb/Core/Debugger.h | 3 | ||||
-rw-r--r-- | lldb/source/API/SBDebugger.cpp | 3 | ||||
-rw-r--r-- | lldb/source/Core/Debugger.cpp | 19 |
3 files changed, 25 insertions, 0 deletions
diff --git a/lldb/include/lldb/Core/Debugger.h b/lldb/include/lldb/Core/Debugger.h index b121ff9c11a..0787a017520 100644 --- a/lldb/include/lldb/Core/Debugger.h +++ b/lldb/include/lldb/Core/Debugger.h @@ -372,6 +372,9 @@ public: const char **end); + void + CleanUpInputReaders (); + protected: static void diff --git a/lldb/source/API/SBDebugger.cpp b/lldb/source/API/SBDebugger.cpp index 2777741ee5e..93d94e6e318 100644 --- a/lldb/source/API/SBDebugger.cpp +++ b/lldb/source/API/SBDebugger.cpp @@ -58,6 +58,9 @@ SBDebugger::Clear () if (log) log->Printf ("SBDebugger(%p)::Clear ()", m_opaque_sp.get()); + + if (m_opaque_sp) + m_opaque_sp->CleanUpInputReaders (); m_opaque_sp.reset(); } diff --git a/lldb/source/Core/Debugger.cpp b/lldb/source/Core/Debugger.cpp index 179e4607c57..a73ac1bf47e 100644 --- a/lldb/source/Core/Debugger.cpp +++ b/lldb/source/Core/Debugger.cpp @@ -184,6 +184,7 @@ Debugger::Debugger () : Debugger::~Debugger () { + CleanUpInputReaders(); int num_targets = m_target_list.GetNumTargets(); for (int i = 0; i < num_targets; i++) { @@ -390,6 +391,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 Debugger::WriteToDefaultReader (const char *bytes, size_t bytes_len) { if (bytes && bytes_len) |