[Lldb-commits] [lldb] r132475 - in /lldb/trunk: include/lldb/Core/Debugger.h include/lldb/Core/InputReaderStack.h lldb.xcodeproj/project.pbxproj source/Core/Debugger.cpp source/Core/InputReaderStack.cpp

Caroline Tice ctice at apple.com
Thu Jun 2 12:18:56 PDT 2011


Author: ctice
Date: Thu Jun  2 14:18:55 2011
New Revision: 132475

URL: http://llvm.org/viewvc/llvm-project?rev=132475&view=rev
Log:

Create new class, InputReaderStack, to better handle 
mutexes around input readers and prevent deadlocking; modify
Debugger to use the new class.


Added:
    lldb/trunk/include/lldb/Core/InputReaderStack.h
    lldb/trunk/source/Core/InputReaderStack.cpp
Modified:
    lldb/trunk/include/lldb/Core/Debugger.h
    lldb/trunk/lldb.xcodeproj/project.pbxproj
    lldb/trunk/source/Core/Debugger.cpp

Modified: lldb/trunk/include/lldb/Core/Debugger.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/Debugger.h?rev=132475&r1=132474&r2=132475&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Core/Debugger.h (original)
+++ lldb/trunk/include/lldb/Core/Debugger.h Thu Jun  2 14:18:55 2011
@@ -18,6 +18,7 @@
 #include <stack>
 
 #include "lldb/Core/Communication.h"
+#include "lldb/Core/InputReaderStack.h"
 #include "lldb/Core/Listener.h"
 #include "lldb/Core/StreamFile.h"
 #include "lldb/Core/SourceManager.h"
@@ -451,8 +452,7 @@
     SourceManager m_source_manager;
     std::auto_ptr<CommandInterpreter> m_command_interpreter_ap;
 
-    Mutex m_input_readers_mutex;
-    std::stack<lldb::InputReaderSP> m_input_readers;
+    InputReaderStack m_input_reader_stack;
     std::string m_input_reader_data;
 
 private:

Added: lldb/trunk/include/lldb/Core/InputReaderStack.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/InputReaderStack.h?rev=132475&view=auto
==============================================================================
--- lldb/trunk/include/lldb/Core/InputReaderStack.h (added)
+++ lldb/trunk/include/lldb/Core/InputReaderStack.h Thu Jun  2 14:18:55 2011
@@ -0,0 +1,58 @@
+//===-- InputReaderStack.h --------------------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef liblldb_InputReaderStack_h_
+#define liblldb_InputReaderStack_h_
+
+#include <stack>
+
+#include "lldb/lldb-private.h"
+#include "lldb/Host/Mutex.h"
+
+namespace lldb_private {
+
+class InputReaderStack
+{
+public:
+
+    InputReaderStack ();
+    
+    ~InputReaderStack ();
+
+    size_t
+    GetSize () const;
+    
+    void
+    Push (const lldb::InputReaderSP& reader_sp);
+    
+    bool
+    IsEmpty () const;
+    
+    lldb::InputReaderSP
+    Top ();
+    
+    void
+    Pop ();
+    
+    Mutex &
+    GetStackMutex ();
+    
+protected:
+
+    std::stack<lldb::InputReaderSP> m_input_readers;
+    mutable Mutex m_input_readers_mutex;
+    
+private:
+
+    DISALLOW_COPY_AND_ASSIGN (InputReaderStack);
+};
+
+} // namespace lldb_private
+
+#endif // liblldb_InputReaderStack_h_

Modified: lldb/trunk/lldb.xcodeproj/project.pbxproj
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lldb.xcodeproj/project.pbxproj?rev=132475&r1=132474&r2=132475&view=diff
==============================================================================
--- lldb/trunk/lldb.xcodeproj/project.pbxproj (original)
+++ lldb/trunk/lldb.xcodeproj/project.pbxproj Thu Jun  2 14:18:55 2011
@@ -409,6 +409,8 @@
 		9A3576A8116E9AB700E8ED2F /* SBHostOS.h in Headers */ = {isa = PBXBuildFile; fileRef = 9A3576A7116E9AB700E8ED2F /* SBHostOS.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		9A3576AA116E9AC700E8ED2F /* SBHostOS.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9A3576A9116E9AC700E8ED2F /* SBHostOS.cpp */; };
 		9A4F35101368A51A00823F52 /* StreamAsynchronousIO.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9A4F350F1368A51A00823F52 /* StreamAsynchronousIO.cpp */; };
+		9A9E1EFF1398086D005AC039 /* InputReaderStack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9A9E1EFE1398086D005AC039 /* InputReaderStack.cpp */; };
+		9A9E1F0113980943005AC039 /* InputReaderStack.h in Headers */ = {isa = PBXBuildFile; fileRef = 9A9E1F0013980943005AC039 /* InputReaderStack.h */; };
 		9AA69DA61188F52100D753A0 /* PseudoTerminal.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2682F16A115EDA0D00CCFF99 /* PseudoTerminal.cpp */; };
 		9AA69DAF118A023300D753A0 /* SBInputReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 9AA69DAE118A023300D753A0 /* SBInputReader.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		9AA69DB1118A024600D753A0 /* SBInputReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9AA69DB0118A024600D753A0 /* SBInputReader.cpp */; };
@@ -1200,6 +1202,8 @@
 		9A9831081125FC5800A56CB0 /* SBTarget.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SBTarget.h; path = include/lldb/API/SBTarget.h; sourceTree = "<group>"; };
 		9A9831091125FC5800A56CB0 /* SBThread.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SBThread.cpp; path = source/API/SBThread.cpp; sourceTree = "<group>"; };
 		9A98310A1125FC5800A56CB0 /* SBThread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SBThread.h; path = include/lldb/API/SBThread.h; sourceTree = "<group>"; };
+		9A9E1EFE1398086D005AC039 /* InputReaderStack.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = InputReaderStack.cpp; path = source/Core/InputReaderStack.cpp; sourceTree = "<group>"; };
+		9A9E1F0013980943005AC039 /* InputReaderStack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = InputReaderStack.h; path = include/lldb/Core/InputReaderStack.h; sourceTree = "<group>"; };
 		9AA69DAE118A023300D753A0 /* SBInputReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SBInputReader.h; path = include/lldb/API/SBInputReader.h; sourceTree = "<group>"; };
 		9AA69DB0118A024600D753A0 /* SBInputReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SBInputReader.cpp; path = source/API/SBInputReader.cpp; sourceTree = "<group>"; };
 		9AA69DB5118A027A00D753A0 /* InputReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = InputReader.cpp; path = source/Core/InputReader.cpp; sourceTree = "<group>"; };
@@ -1889,6 +1893,8 @@
 				26BC7D6410F1B77400F91463 /* Flags.h */,
 				9AA69DBB118A029E00D753A0 /* InputReader.h */,
 				9AA69DB5118A027A00D753A0 /* InputReader.cpp */,
+				9A9E1F0013980943005AC039 /* InputReaderStack.h */,
+				9A9E1EFE1398086D005AC039 /* InputReaderStack.cpp */,
 				26BC7D6510F1B77400F91463 /* IOStreamMacros.h */,
 				26BC7D6610F1B77400F91463 /* Language.h */,
 				26BC7E7D10F1B85900F91463 /* Language.cpp */,
@@ -2619,6 +2625,7 @@
 			isa = PBXHeadersBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				9A9E1F0113980943005AC039 /* InputReaderStack.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -3201,6 +3208,7 @@
 				26DB3E1F1379E7AD0080DC73 /* ABISysV_x86_64.cpp in Sources */,
 				26A69C5F137A17A500262477 /* RegisterValue.cpp in Sources */,
 				2690B3711381D5C300ECFBAE /* Memory.cpp in Sources */,
+				9A9E1EFF1398086D005AC039 /* InputReaderStack.cpp in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};

Modified: lldb/trunk/source/Core/Debugger.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/Debugger.cpp?rev=132475&r1=132474&r2=132475&view=diff
==============================================================================
--- lldb/trunk/source/Core/Debugger.cpp (original)
+++ lldb/trunk/source/Core/Debugger.cpp Thu Jun  2 14:18:55 2011
@@ -230,8 +230,7 @@
     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 @@
 {
     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 @@
 {
     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 @@
     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 @@
     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 @@
 
     // 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 @@
 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())
         {

Added: lldb/trunk/source/Core/InputReaderStack.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/InputReaderStack.cpp?rev=132475&view=auto
==============================================================================
--- lldb/trunk/source/Core/InputReaderStack.cpp (added)
+++ lldb/trunk/source/Core/InputReaderStack.cpp Thu Jun  2 14:18:55 2011
@@ -0,0 +1,80 @@
+//===-- InputReaderStack.cpp ------------------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "lldb/Core/InputReaderStack.h"
+
+// C Includes
+// C++ Includes
+// Other libraries and framework includes
+// Project includes
+
+
+using namespace lldb;
+using namespace lldb_private;
+
+InputReaderStack::InputReaderStack () :
+    m_input_readers (),
+    m_input_readers_mutex (Mutex::eMutexTypeRecursive)
+{
+}
+
+InputReaderStack::~InputReaderStack ()
+{
+}
+
+size_t
+InputReaderStack::GetSize () const
+{
+    Mutex::Locker locker (m_input_readers_mutex);
+    return m_input_readers.size();
+}
+    
+void
+InputReaderStack::Push (const lldb::InputReaderSP& reader_sp)
+{
+    if (reader_sp)
+    {
+        Mutex::Locker locker (m_input_readers_mutex);
+        m_input_readers.push (reader_sp);
+    }
+}
+    
+bool
+InputReaderStack::IsEmpty () const
+{
+    Mutex::Locker locker (m_input_readers_mutex);
+    return m_input_readers.empty();
+}
+    
+InputReaderSP
+InputReaderStack::Top ()
+{
+    InputReaderSP input_reader_sp;
+    {
+        Mutex::Locker locker (m_input_readers_mutex);
+        if (!m_input_readers.empty())
+            input_reader_sp = m_input_readers.top();
+    }
+        
+    return input_reader_sp;
+}
+    
+void
+InputReaderStack::Pop ()
+{
+    Mutex::Locker locker (m_input_readers_mutex);
+    if (!m_input_readers.empty())
+        m_input_readers.pop();
+}
+    
+Mutex &
+InputReaderStack::GetStackMutex ()
+{
+    return m_input_readers_mutex;
+}





More information about the lldb-commits mailing list