Hi ki.stfu, clayborg,

lldb-mi has 3 threads.
1. One that waits for user intput.
2. Another waits for 1st thread to get input command.
3. Waits for events from lldb.
    
2 & 3 needs to be synchronized so that they don't end up doing things at same 
time. For example, while "break insert" is processing, we can get a breakpoint 
event. Depending on where we are in "break-insert", it can have different 
behavior. In some cases, it can cause breakpoint to be delete too. I have added 
a mutex so that command processing and event processing are done exclusively. 
They are not running at the same time.

In longer term, I think thread 2 & 3 should be merged to be only one thread 
which can wait on command or events.

http://reviews.llvm.org/D7371

Files:
  MICmnLLDBDebugSessionInfo.h
  MICmnLLDBDebugger.cpp
  MIDriver.cpp

Index: MICmnLLDBDebugSessionInfo.h
===================================================================
--- MICmnLLDBDebugSessionInfo.h
+++ MICmnLLDBDebugSessionInfo.h
@@ -35,6 +35,7 @@
 #include "MICmnLLDBDebugSessionInfoVarObj.h"
 #include "MICmnMIValueTuple.h"
 #include "MIUtilMapIdToVariant.h"
+#include "MIUtilThreadBaseStd.h"
 
 // Declarations:
 class CMICmnLLDBDebugger;
@@ -156,6 +157,7 @@
     bool RecordBrkPtInfo(const MIuint vnBrkPtId, const SBrkPtInfo 
&vrBrkPtInfo);
     bool RecordBrkPtInfoGet(const MIuint vnBrkPtId, SBrkPtInfo &vrwBrkPtInfo) 
const;
     bool RecordBrkPtInfoDelete(const MIuint vnBrkPtId);
+    CMIUtilThreadMutex& GetSessionMutex() { return m_sessionMutex;}
     lldb::SBDebugger &GetDebugger() const;
     lldb::SBListener &GetListener() const;
     lldb::SBTarget GetTarget() const;
@@ -200,6 +202,7 @@
     CMIUtilMapIdToVariant m_mapIdToSessionData; // Hold and retrieve key to 
value data available across all commands
     VecVarObj_t m_vecVarObj;                    // Vector of session variable 
objects
     MapBrkPtIdToBrkPtInfo_t m_mapBrkPtIdToBrkPtInfo;
+    CMIUtilThreadMutex m_sessionMutex;
 };
 
 //++ 
------------------------------------------------------------------------------------
Index: MICmnLLDBDebugger.cpp
===================================================================
--- MICmnLLDBDebugger.cpp
+++ MICmnLLDBDebugger.cpp
@@ -664,7 +664,13 @@
 
     bool bHandledEvent = false;
     bool bExitAppEvent = false;
-    const bool bOk = 
CMICmnLLDBDebuggerHandleEvents::Instance().HandleEvent(event, bHandledEvent, 
bExitAppEvent);
+
+    bool bOk = false;
+    {
+        // Lock Mutex before handling events so that we don't disturb a 
running cmd
+        CMIUtilThreadLock 
lock(CMICmnLLDBDebugSessionInfo::Instance().GetSessionMutex());
+        bOk = CMICmnLLDBDebuggerHandleEvents::Instance().HandleEvent(event, 
bHandledEvent, bExitAppEvent);
+    }
     if (!bHandledEvent)
     {
         const CMIUtilString 
msg(CMIUtilString::Format(MIRSRC(IDS_LLDBDEBUGGER_WRN_UNKNOWN_EVENT), 
event.GetBroadcasterClass()));
Index: MIDriver.cpp
===================================================================
--- MIDriver.cpp
+++ MIDriver.cpp
@@ -41,6 +41,7 @@
 #include "MICmdArgValFile.h"
 #include "MICmdArgValString.h"
 #include "MICmnConfig.h"
+#include "MICmnLLDBDebugSessionInfo.h"
 
 // Instantiations:
 #if _DEBUG
@@ -687,7 +688,13 @@
         }
 
         // Process the command
-        const bool bOk = InterpretCommand(lineText);
+        bool bOk = false;
+        {
+            // Lock Mutex before processing commands so that we don't disturb 
an event
+            // that is being processed.
+            CMIUtilThreadLock 
lock(CMICmnLLDBDebugSessionInfo::Instance().GetSessionMutex());
+            bOk = InterpretCommand(lineText);
+        }
 
         // Draw prompt if desired
         if (bOk && m_rStdin.GetEnablePrompt())

EMAIL PREFERENCES
  http://reviews.llvm.org/settings/panel/emailpreferences/
Index: MICmnLLDBDebugSessionInfo.h
===================================================================
--- MICmnLLDBDebugSessionInfo.h
+++ MICmnLLDBDebugSessionInfo.h
@@ -35,6 +35,7 @@
 #include "MICmnLLDBDebugSessionInfoVarObj.h"
 #include "MICmnMIValueTuple.h"
 #include "MIUtilMapIdToVariant.h"
+#include "MIUtilThreadBaseStd.h"
 
 // Declarations:
 class CMICmnLLDBDebugger;
@@ -156,6 +157,7 @@
     bool RecordBrkPtInfo(const MIuint vnBrkPtId, const SBrkPtInfo &vrBrkPtInfo);
     bool RecordBrkPtInfoGet(const MIuint vnBrkPtId, SBrkPtInfo &vrwBrkPtInfo) const;
     bool RecordBrkPtInfoDelete(const MIuint vnBrkPtId);
+    CMIUtilThreadMutex& GetSessionMutex() { return m_sessionMutex;}
     lldb::SBDebugger &GetDebugger() const;
     lldb::SBListener &GetListener() const;
     lldb::SBTarget GetTarget() const;
@@ -200,6 +202,7 @@
     CMIUtilMapIdToVariant m_mapIdToSessionData; // Hold and retrieve key to value data available across all commands
     VecVarObj_t m_vecVarObj;                    // Vector of session variable objects
     MapBrkPtIdToBrkPtInfo_t m_mapBrkPtIdToBrkPtInfo;
+    CMIUtilThreadMutex m_sessionMutex;
 };
 
 //++ ------------------------------------------------------------------------------------
Index: MICmnLLDBDebugger.cpp
===================================================================
--- MICmnLLDBDebugger.cpp
+++ MICmnLLDBDebugger.cpp
@@ -664,7 +664,13 @@
 
     bool bHandledEvent = false;
     bool bExitAppEvent = false;
-    const bool bOk = CMICmnLLDBDebuggerHandleEvents::Instance().HandleEvent(event, bHandledEvent, bExitAppEvent);
+
+    bool bOk = false;
+    {
+        // Lock Mutex before handling events so that we don't disturb a running cmd
+        CMIUtilThreadLock lock(CMICmnLLDBDebugSessionInfo::Instance().GetSessionMutex());
+        bOk = CMICmnLLDBDebuggerHandleEvents::Instance().HandleEvent(event, bHandledEvent, bExitAppEvent);
+    }
     if (!bHandledEvent)
     {
         const CMIUtilString msg(CMIUtilString::Format(MIRSRC(IDS_LLDBDEBUGGER_WRN_UNKNOWN_EVENT), event.GetBroadcasterClass()));
Index: MIDriver.cpp
===================================================================
--- MIDriver.cpp
+++ MIDriver.cpp
@@ -41,6 +41,7 @@
 #include "MICmdArgValFile.h"
 #include "MICmdArgValString.h"
 #include "MICmnConfig.h"
+#include "MICmnLLDBDebugSessionInfo.h"
 
 // Instantiations:
 #if _DEBUG
@@ -687,7 +688,13 @@
         }
 
         // Process the command
-        const bool bOk = InterpretCommand(lineText);
+        bool bOk = false;
+        {
+            // Lock Mutex before processing commands so that we don't disturb an event
+            // that is being processed.
+            CMIUtilThreadLock lock(CMICmnLLDBDebugSessionInfo::Instance().GetSessionMutex());
+            bOk = InterpretCommand(lineText);
+        }
 
         // Draw prompt if desired
         if (bOk && m_rStdin.GetEnablePrompt())
_______________________________________________
lldb-commits mailing list
lldb-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits

Reply via email to