summaryrefslogtreecommitdiffstats
path: root/lldb/source/Core/Debugger.cpp
diff options
context:
space:
mode:
authorCaroline Tice <ctice@apple.com>2011-06-02 19:18:55 +0000
committerCaroline Tice <ctice@apple.com>2011-06-02 19:18:55 +0000
commitd5a0a01b2db4dd9523e78ecef674919f75f4cb75 (patch)
tree732b912e18c3bd8b302177c4c1b68cc7860535b4 /lldb/source/Core/Debugger.cpp
parent9d4a8cf481aa8ce6a57f945175db9421a1ce612e (diff)
downloadbcm5719-llvm-d5a0a01b2db4dd9523e78ecef674919f75f4cb75.tar.gz
bcm5719-llvm-d5a0a01b2db4dd9523e78ecef674919f75f4cb75.zip
Create new class, InputReaderStack, to better handle
mutexes around input readers and prevent deadlocking; modify Debugger to use the new class. llvm-svn: 132475
Diffstat (limited to 'lldb/source/Core/Debugger.cpp')
-rw-r--r--lldb/source/Core/Debugger.cpp35
1 files changed, 14 insertions, 21 deletions
diff --git a/lldb/source/Core/Debugger.cpp b/lldb/source/Core/Debugger.cpp
index 80035363650..ace2c9a54f9 100644
--- a/lldb/source/Core/Debugger.cpp
+++ b/lldb/source/Core/Debugger.cpp
@@ -230,8 +230,7 @@ Debugger::Debugger () :
m_listener ("lldb.Debugger"),
m_source_manager (),
m_command_interpreter_ap (new CommandInterpreter (*this, eScriptLanguageDefault, false)),
- m_input_readers_mutex (Mutex::eMutexTypeRecursive),
- m_input_readers (),
+ m_input_reader_stack (),
m_input_reader_data ()
{
m_command_interpreter_ap->Initialize ();
@@ -357,14 +356,13 @@ Debugger::GetCurrentInputReader ()
{
InputReaderSP reader_sp;
- Mutex::Locker locker (m_input_readers_mutex);
- if (!m_input_readers.empty())
+ if (!m_input_reader_stack.IsEmpty())
{
// Clear any finished readers from the stack
while (CheckIfTopInputReaderIsDone()) ;
- if (!m_input_readers.empty())
- reader_sp = m_input_readers.top();
+ if (!m_input_reader_stack.IsEmpty())
+ reader_sp = m_input_reader_stack.Top();
}
return reader_sp;
@@ -424,9 +422,8 @@ Debugger::CleanUpInputReaders ()
{
m_input_reader_data.clear();
- Mutex::Locker locker (m_input_readers_mutex);
// The bottom input reader should be the main debugger input reader. We do not want to close that one here.
- while (m_input_readers.size() > 1)
+ while (m_input_reader_stack.GetSize() > 1)
{
InputReaderSP reader_sp (GetCurrentInputReader ());
if (reader_sp)
@@ -479,8 +476,7 @@ Debugger::WriteToDefaultReader (const char *bytes, size_t bytes_len)
if (m_input_reader_data.empty())
return;
- Mutex::Locker locker (m_input_readers_mutex);
- while (!m_input_readers.empty() && !m_input_reader_data.empty())
+ while (!m_input_reader_stack.IsEmpty() && !m_input_reader_data.empty())
{
// Get the input reader from the top of the stack
InputReaderSP reader_sp (GetCurrentInputReader ());
@@ -519,8 +515,7 @@ Debugger::PushInputReader (const InputReaderSP& reader_sp)
if (top_reader_sp)
top_reader_sp->Notify (eInputReaderDeactivate);
- Mutex::Locker locker (m_input_readers_mutex);
- m_input_readers.push (reader_sp);
+ m_input_reader_stack.Push (reader_sp);
reader_sp->Notify (eInputReaderActivate);
ActivateInputReader (reader_sp);
}
@@ -532,22 +527,21 @@ Debugger::PopInputReader (const lldb::InputReaderSP& pop_reader_sp)
// The reader on the stop of the stack is done, so let the next
// read on the stack referesh its prompt and if there is one...
- Mutex::Locker locker (m_input_readers_mutex);
- if (!m_input_readers.empty())
+ if (!m_input_reader_stack.IsEmpty())
{
// Cannot call GetCurrentInputReader here, as that would cause an infinite loop.
- InputReaderSP reader_sp(m_input_readers.top());
+ InputReaderSP reader_sp(m_input_reader_stack.Top());
if (!pop_reader_sp || pop_reader_sp.get() == reader_sp.get())
{
- m_input_readers.pop ();
+ m_input_reader_stack.Pop ();
reader_sp->Notify (eInputReaderDeactivate);
reader_sp->Notify (eInputReaderDone);
result = true;
- if (!m_input_readers.empty())
+ if (!m_input_reader_stack.IsEmpty())
{
- reader_sp = m_input_readers.top();
+ reader_sp = m_input_reader_stack.Top();
if (reader_sp)
{
ActivateInputReader (reader_sp);
@@ -563,11 +557,10 @@ bool
Debugger::CheckIfTopInputReaderIsDone ()
{
bool result = false;
- Mutex::Locker locker (m_input_readers_mutex);
- if (!m_input_readers.empty())
+ if (!m_input_reader_stack.IsEmpty())
{
// Cannot call GetCurrentInputReader here, as that would cause an infinite loop.
- InputReaderSP reader_sp(m_input_readers.top());
+ InputReaderSP reader_sp(m_input_reader_stack.Top());
if (reader_sp && reader_sp->IsDone())
{
OpenPOWER on IntegriCloud