aboutsummaryrefslogtreecommitdiff
path: root/lldb/tools/lldb-mi/MICmnLLDBDebugger.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/tools/lldb-mi/MICmnLLDBDebugger.cpp')
-rw-r--r--lldb/tools/lldb-mi/MICmnLLDBDebugger.cpp1171
1 files changed, 610 insertions, 561 deletions
diff --git a/lldb/tools/lldb-mi/MICmnLLDBDebugger.cpp b/lldb/tools/lldb-mi/MICmnLLDBDebugger.cpp
index d5bff15..a676ecc 100644
--- a/lldb/tools/lldb-mi/MICmnLLDBDebugger.cpp
+++ b/lldb/tools/lldb-mi/MICmnLLDBDebugger.cpp
@@ -8,64 +8,72 @@
//===----------------------------------------------------------------------===//
// Third party headers:
+#include "lldb/API/SBCommandInterpreter.h"
+#include "lldb/API/SBProcess.h"
+#include "lldb/API/SBStream.h"
#include "lldb/API/SBTarget.h"
#include "lldb/API/SBThread.h"
-#include "lldb/API/SBProcess.h"
-#include "lldb/API/SBCommandInterpreter.h"
-#include "lldb/API/SBTypeSummary.h"
+#include "lldb/API/SBType.h"
#include "lldb/API/SBTypeCategory.h"
#include "lldb/API/SBTypeNameSpecifier.h"
-#include "lldb/API/SBStream.h"
-#include "lldb/API/SBType.h"
+#include "lldb/API/SBTypeSummary.h"
// In-house headers:
+#include "MICmnLLDBDebugSessionInfo.h"
#include "MICmnLLDBDebugger.h"
-#include "MICmnResources.h"
+#include "MICmnLLDBDebuggerHandleEvents.h"
#include "MICmnLog.h"
-#include "MIDriverBase.h"
+#include "MICmnResources.h"
#include "MICmnThreadMgrStd.h"
-#include "MICmnLLDBDebuggerHandleEvents.h"
-#include "MICmnLLDBDebugSessionInfo.h"
+#include "MIDriverBase.h"
#include "MIUtilSingletonHelper.h"
-//++ ------------------------------------------------------------------------------------
+//++
+//------------------------------------------------------------------------------------
// MI private summary providers
-static inline bool
-MI_char_summary_provider(lldb::SBValue value, lldb::SBTypeSummaryOptions options, lldb::SBStream &stream)
-{
- if (!value.IsValid())
- return false;
-
- lldb::SBType value_type = value.GetType();
- if(!value_type.IsValid())
- return false;
-
- lldb::BasicType type_code = value_type.GetBasicType();
- if (type_code == lldb::eBasicTypeSignedChar)
- stream.Printf("%d %s", (int)value.GetValueAsSigned(), value.GetValue());
- else if (type_code == lldb::eBasicTypeUnsignedChar)
- stream.Printf("%u %s", (unsigned)value.GetValueAsUnsigned(), value.GetValue());
- else
- return false;
-
- return true;
+static inline bool MI_char_summary_provider(lldb::SBValue value,
+ lldb::SBTypeSummaryOptions options,
+ lldb::SBStream &stream) {
+ if (!value.IsValid())
+ return false;
+
+ lldb::SBType value_type = value.GetType();
+ if (!value_type.IsValid())
+ return false;
+
+ lldb::BasicType type_code = value_type.GetBasicType();
+ if (type_code == lldb::eBasicTypeSignedChar)
+ stream.Printf("%d %s", (int)value.GetValueAsSigned(), value.GetValue());
+ else if (type_code == lldb::eBasicTypeUnsignedChar)
+ stream.Printf("%u %s", (unsigned)value.GetValueAsUnsigned(),
+ value.GetValue());
+ else
+ return false;
+
+ return true;
}
-//++ ------------------------------------------------------------------------------------
+//++
+//------------------------------------------------------------------------------------
// MI summary helper routines
-static inline bool
-MI_add_summary(lldb::SBTypeCategory category, const char *typeName, lldb::SBTypeSummary::FormatCallback cb,
- uint32_t options, bool regex = false)
-{
+static inline bool MI_add_summary(lldb::SBTypeCategory category,
+ const char *typeName,
+ lldb::SBTypeSummary::FormatCallback cb,
+ uint32_t options, bool regex = false) {
#if defined(LLDB_DISABLE_PYTHON)
- return false;
+ return false;
#else
- lldb::SBTypeSummary summary = lldb::SBTypeSummary::CreateWithCallback(cb, options);
- return summary.IsValid() ? category.AddTypeSummary(lldb::SBTypeNameSpecifier(typeName, regex), summary) : false;
+ lldb::SBTypeSummary summary =
+ lldb::SBTypeSummary::CreateWithCallback(cb, options);
+ return summary.IsValid()
+ ? category.AddTypeSummary(
+ lldb::SBTypeNameSpecifier(typeName, regex), summary)
+ : false;
#endif
-}
+}
-//++ ------------------------------------------------------------------------------------
+//++
+//------------------------------------------------------------------------------------
// Details: CMICmnLLDBDebugger constructor.
// Type: Method.
// Args: None.
@@ -73,23 +81,20 @@ MI_add_summary(lldb::SBTypeCategory category, const char *typeName, lldb::SBType
// Throws: None.
//--
CMICmnLLDBDebugger::CMICmnLLDBDebugger()
- : m_constStrThisThreadId("MI debugger event")
-{
-}
+ : m_constStrThisThreadId("MI debugger event") {}
-//++ ------------------------------------------------------------------------------------
+//++
+//------------------------------------------------------------------------------------
// Details: CMICmnLLDBDebugger destructor.
// Type: Overridable.
// Args: None.
// Return: None.
// Throws: None.
//--
-CMICmnLLDBDebugger::~CMICmnLLDBDebugger()
-{
- Shutdown();
-}
+CMICmnLLDBDebugger::~CMICmnLLDBDebugger() { Shutdown(); }
-//++ ------------------------------------------------------------------------------------
+//++
+//------------------------------------------------------------------------------------
// Details: Initialize resources for *this debugger object.
// Type: Method.
// Args: None.
@@ -97,62 +102,61 @@ CMICmnLLDBDebugger::~CMICmnLLDBDebugger()
// MIstatus::failure - Functionality failed.
// Throws: None.
//--
-bool
-CMICmnLLDBDebugger::Initialize()
-{
- m_clientUsageRefCnt++;
-
- if (m_bInitialized)
- return MIstatus::success;
-
- bool bOk = MIstatus::success;
- CMIUtilString errMsg;
- ClrErrorDescription();
-
- if (m_pClientDriver == nullptr)
- {
- bOk = false;
- errMsg = MIRSRC(IDS_LLDBDEBUGGER_ERR_CLIENTDRIVER);
- }
+bool CMICmnLLDBDebugger::Initialize() {
+ m_clientUsageRefCnt++;
- // Note initialization order is important here as some resources depend on previous
- MI::ModuleInit<CMICmnLog>(IDS_MI_INIT_ERR_LOG, bOk, errMsg);
- MI::ModuleInit<CMICmnResources>(IDS_MI_INIT_ERR_RESOURCES, bOk, errMsg);
- MI::ModuleInit<CMICmnThreadMgrStd>(IDS_MI_INIT_ERR_THREADMGR, bOk, errMsg);
- MI::ModuleInit<CMICmnLLDBDebuggerHandleEvents>(IDS_MI_INIT_ERR_OUTOFBANDHANDLER, bOk, errMsg);
- MI::ModuleInit<CMICmnLLDBDebugSessionInfo>(IDS_MI_INIT_ERR_DEBUGSESSIONINFO, bOk, errMsg);
-
- // Note order is important here!
- if (bOk)
- lldb::SBDebugger::Initialize();
- if (bOk && !InitSBDebugger())
- {
- bOk = false;
- if (!errMsg.empty())
- errMsg += ", ";
- errMsg += GetErrorDescription().c_str();
- }
- if (bOk && !InitSBListener())
- {
- bOk = false;
- if (!errMsg.empty())
- errMsg += ", ";
- errMsg += GetErrorDescription().c_str();
- }
- bOk = bOk && InitStdStreams();
- bOk = bOk && RegisterMISummaryProviders();
- m_bInitialized = bOk;
-
- if (!bOk && !HaveErrorDescription())
- {
- CMIUtilString strInitError(CMIUtilString::Format(MIRSRC(IDS_MI_INIT_ERR_LLDBDEBUGGER), errMsg.c_str()));
- SetErrorDescription(strInitError);
- }
+ if (m_bInitialized)
+ return MIstatus::success;
- return bOk;
+ bool bOk = MIstatus::success;
+ CMIUtilString errMsg;
+ ClrErrorDescription();
+
+ if (m_pClientDriver == nullptr) {
+ bOk = false;
+ errMsg = MIRSRC(IDS_LLDBDEBUGGER_ERR_CLIENTDRIVER);
+ }
+
+ // Note initialization order is important here as some resources depend on
+ // previous
+ MI::ModuleInit<CMICmnLog>(IDS_MI_INIT_ERR_LOG, bOk, errMsg);
+ MI::ModuleInit<CMICmnResources>(IDS_MI_INIT_ERR_RESOURCES, bOk, errMsg);
+ MI::ModuleInit<CMICmnThreadMgrStd>(IDS_MI_INIT_ERR_THREADMGR, bOk, errMsg);
+ MI::ModuleInit<CMICmnLLDBDebuggerHandleEvents>(
+ IDS_MI_INIT_ERR_OUTOFBANDHANDLER, bOk, errMsg);
+ MI::ModuleInit<CMICmnLLDBDebugSessionInfo>(IDS_MI_INIT_ERR_DEBUGSESSIONINFO,
+ bOk, errMsg);
+
+ // Note order is important here!
+ if (bOk)
+ lldb::SBDebugger::Initialize();
+ if (bOk && !InitSBDebugger()) {
+ bOk = false;
+ if (!errMsg.empty())
+ errMsg += ", ";
+ errMsg += GetErrorDescription().c_str();
+ }
+ if (bOk && !InitSBListener()) {
+ bOk = false;
+ if (!errMsg.empty())
+ errMsg += ", ";
+ errMsg += GetErrorDescription().c_str();
+ }
+ bOk = bOk && InitStdStreams();
+ bOk = bOk && RegisterMISummaryProviders();
+ m_bInitialized = bOk;
+
+ if (!bOk && !HaveErrorDescription()) {
+ CMIUtilString strInitError(CMIUtilString::Format(
+ MIRSRC(IDS_MI_INIT_ERR_LLDBDEBUGGER), errMsg.c_str()));
+ SetErrorDescription(strInitError);
+ }
+
+ return bOk;
}
-//++ ------------------------------------------------------------------------------------
+//++
+//------------------------------------------------------------------------------------
// Details: Release resources for *this debugger object.
// Type: Method.
// Args: None.
@@ -160,81 +164,85 @@ CMICmnLLDBDebugger::Initialize()
// MIstatus::failure - Functionality failed.
// Throws: None.
//--
-bool
-CMICmnLLDBDebugger::Shutdown()
-{
- if (--m_clientUsageRefCnt > 0)
- return MIstatus::success;
-
- if (!m_bInitialized)
- return MIstatus::success;
-
- m_bInitialized = false;
-
- ClrErrorDescription();
-
- bool bOk = MIstatus::success;
- CMIUtilString errMsg;
-
- // Explicitly delete the remote target in case MI needs to exit prematurely otherwise
- // LLDB debugger may hang in its Destroy() fn waiting on events
- lldb::SBTarget sbTarget = CMICmnLLDBDebugSessionInfo::Instance().GetTarget();
- m_lldbDebugger.DeleteTarget(sbTarget);
-
- // Debug: May need this but does seem to work without it so commented out the fudge 19/06/2014
- // It appears we need to wait as hang does not occur when hitting a debug breakpoint here
- // const std::chrono::milliseconds time( 1000 );
- // std::this_thread::sleep_for( time );
-
- lldb::SBDebugger::Destroy(m_lldbDebugger);
- lldb::SBDebugger::Terminate();
- m_pClientDriver = nullptr;
- m_mapBroadcastClassNameToEventMask.clear();
- m_mapIdToEventMask.clear();
-
- // Note shutdown order is important here
- MI::ModuleShutdown<CMICmnLLDBDebugSessionInfo>(IDS_MI_INIT_ERR_DEBUGSESSIONINFO, bOk, errMsg);
- MI::ModuleShutdown<CMICmnLLDBDebuggerHandleEvents>(IDS_MI_INIT_ERR_OUTOFBANDHANDLER, bOk, errMsg);
- MI::ModuleShutdown<CMICmnThreadMgrStd>(IDS_MI_INIT_ERR_THREADMGR, bOk, errMsg);
- MI::ModuleShutdown<CMICmnResources>(IDS_MI_INIT_ERR_RESOURCES, bOk, errMsg);
- MI::ModuleShutdown<CMICmnLog>(IDS_MI_INIT_ERR_LOG, bOk, errMsg);
-
- if (!bOk)
- {
- SetErrorDescriptionn(MIRSRC(IDS_MI_SHTDWN_ERR_LLDBDEBUGGER), errMsg.c_str());
- }
+bool CMICmnLLDBDebugger::Shutdown() {
+ if (--m_clientUsageRefCnt > 0)
+ return MIstatus::success;
+ if (!m_bInitialized)
return MIstatus::success;
+
+ m_bInitialized = false;
+
+ ClrErrorDescription();
+
+ bool bOk = MIstatus::success;
+ CMIUtilString errMsg;
+
+ // Explicitly delete the remote target in case MI needs to exit prematurely
+ // otherwise
+ // LLDB debugger may hang in its Destroy() fn waiting on events
+ lldb::SBTarget sbTarget = CMICmnLLDBDebugSessionInfo::Instance().GetTarget();
+ m_lldbDebugger.DeleteTarget(sbTarget);
+
+ // Debug: May need this but does seem to work without it so commented out the
+ // fudge 19/06/2014
+ // It appears we need to wait as hang does not occur when hitting a debug
+ // breakpoint here
+ // const std::chrono::milliseconds time( 1000 );
+ // std::this_thread::sleep_for( time );
+
+ lldb::SBDebugger::Destroy(m_lldbDebugger);
+ lldb::SBDebugger::Terminate();
+ m_pClientDriver = nullptr;
+ m_mapBroadcastClassNameToEventMask.clear();
+ m_mapIdToEventMask.clear();
+
+ // Note shutdown order is important here
+ MI::ModuleShutdown<CMICmnLLDBDebugSessionInfo>(
+ IDS_MI_INIT_ERR_DEBUGSESSIONINFO, bOk, errMsg);
+ MI::ModuleShutdown<CMICmnLLDBDebuggerHandleEvents>(
+ IDS_MI_INIT_ERR_OUTOFBANDHANDLER, bOk, errMsg);
+ MI::ModuleShutdown<CMICmnThreadMgrStd>(IDS_MI_INIT_ERR_THREADMGR, bOk,
+ errMsg);
+ MI::ModuleShutdown<CMICmnResources>(IDS_MI_INIT_ERR_RESOURCES, bOk, errMsg);
+ MI::ModuleShutdown<CMICmnLog>(IDS_MI_INIT_ERR_LOG, bOk, errMsg);
+
+ if (!bOk) {
+ SetErrorDescriptionn(MIRSRC(IDS_MI_SHTDWN_ERR_LLDBDEBUGGER),
+ errMsg.c_str());
+ }
+
+ return MIstatus::success;
}
-//++ ------------------------------------------------------------------------------------
+//++
+//------------------------------------------------------------------------------------
// Details: Return the LLDB debugger instance created for this debug session.
// Type: Method.
// Args: None.
// Return: lldb::SBDebugger & - LLDB debugger object reference.
// Throws: None.
//--
-lldb::SBDebugger &
-CMICmnLLDBDebugger::GetTheDebugger()
-{
- return m_lldbDebugger;
+lldb::SBDebugger &CMICmnLLDBDebugger::GetTheDebugger() {
+ return m_lldbDebugger;
}
-//++ ------------------------------------------------------------------------------------
+//++
+//------------------------------------------------------------------------------------
// Details: Return the LLDB listener instance created for this debug session.
// Type: Method.
// Args: None.
// Return: lldb::SBListener & - LLDB listener object reference.
// Throws: None.
//--
-lldb::SBListener &
-CMICmnLLDBDebugger::GetTheListener()
-{
- return m_lldbListener;
+lldb::SBListener &CMICmnLLDBDebugger::GetTheListener() {
+ return m_lldbListener;
}
-//++ ------------------------------------------------------------------------------------
-// Details: Set the client driver that wants to use *this LLDB debugger. Call this function
+//++
+//------------------------------------------------------------------------------------
+// Details: Set the client driver that wants to use *this LLDB debugger. Call
+// this function
// prior to Initialize().
// Type: Method.
// Args: vClientDriver - (R) A driver.
@@ -242,32 +250,33 @@ CMICmnLLDBDebugger::GetTheListener()
// MIstatus::failure - Functionality failed.
// Throws: None.
//--
-bool
-CMICmnLLDBDebugger::SetDriver(const CMIDriverBase &vClientDriver)
-{
- m_pClientDriver = const_cast<CMIDriverBase *>(&vClientDriver);
+bool CMICmnLLDBDebugger::SetDriver(const CMIDriverBase &vClientDriver) {
+ m_pClientDriver = const_cast<CMIDriverBase *>(&vClientDriver);
- return MIstatus::success;
+ return MIstatus::success;
}
-//++ ------------------------------------------------------------------------------------
+//++
+//------------------------------------------------------------------------------------
// Details: Get the client driver that is use *this LLDB debugger.
// Type: Method.
// Args: vClientDriver - (R) A driver.
// Return: CMIDriverBase & - A driver instance.
// Throws: None.
//--
-CMIDriverBase &
-CMICmnLLDBDebugger::GetDriver() const
-{
- return *m_pClientDriver;
+CMIDriverBase &CMICmnLLDBDebugger::GetDriver() const {
+ return *m_pClientDriver;
}
-//++ ------------------------------------------------------------------------------------
+//++
+//------------------------------------------------------------------------------------
// Details: Wait until all events have been handled.
-// This function works in pair with CMICmnLLDBDebugger::MonitorSBListenerEvents
-// that handles events from queue. When all events were handled and queue is
-// empty the MonitorSBListenerEvents notifies this function that it's ready to
+// This function works in pair with
+// CMICmnLLDBDebugger::MonitorSBListenerEvents
+// that handles events from queue. When all events were handled and
+// queue is
+// empty the MonitorSBListenerEvents notifies this function that it's
+// ready to
// go on. To synchronize them the m_mutexEventQueue and
// m_conditionEventQueueEmpty are used.
// Type: Method.
@@ -275,62 +284,64 @@ CMICmnLLDBDebugger::GetDriver() const
// Return: None.
// Throws: None.
//--
-void
-CMICmnLLDBDebugger::WaitForHandleEvent()
-{
- std::unique_lock<std::mutex> lock(m_mutexEventQueue);
-
- lldb::SBEvent event;
- if (ThreadIsActive() && m_lldbListener.PeekAtNextEvent(event))
- m_conditionEventQueueEmpty.wait(lock);
+void CMICmnLLDBDebugger::WaitForHandleEvent() {
+ std::unique_lock<std::mutex> lock(m_mutexEventQueue);
+
+ lldb::SBEvent event;
+ if (ThreadIsActive() && m_lldbListener.PeekAtNextEvent(event))
+ m_conditionEventQueueEmpty.wait(lock);
}
-//++ ------------------------------------------------------------------------------------
-// Details: Check if need to rebroadcast stop event. This function will return true if
+//++
+//------------------------------------------------------------------------------------
+// Details: Check if need to rebroadcast stop event. This function will return
+// true if
// debugger is in synchronouse mode. In such case the
-// CMICmnLLDBDebugger::RebroadcastStopEvent should be called to rebroadcast
+// CMICmnLLDBDebugger::RebroadcastStopEvent should be called to
+// rebroadcast
// a new stop event (if any).
// Type: Method.
// Args: None.
// Return: bool - True = Need to rebroadcast stop event, false = otherwise.
// Throws: None.
//--
-bool
-CMICmnLLDBDebugger::CheckIfNeedToRebroadcastStopEvent()
-{
- CMICmnLLDBDebugSessionInfo &rSessionInfo(CMICmnLLDBDebugSessionInfo::Instance());
- if (!rSessionInfo.GetDebugger().GetAsync())
- {
- const bool include_expression_stops = false;
- m_nLastStopId = CMICmnLLDBDebugSessionInfo::Instance().GetProcess().GetStopID(include_expression_stops);
- return true;
- }
+bool CMICmnLLDBDebugger::CheckIfNeedToRebroadcastStopEvent() {
+ CMICmnLLDBDebugSessionInfo &rSessionInfo(
+ CMICmnLLDBDebugSessionInfo::Instance());
+ if (!rSessionInfo.GetDebugger().GetAsync()) {
+ const bool include_expression_stops = false;
+ m_nLastStopId =
+ CMICmnLLDBDebugSessionInfo::Instance().GetProcess().GetStopID(
+ include_expression_stops);
+ return true;
+ }
- return false;
+ return false;
}
-//++ ------------------------------------------------------------------------------------
-// Details: Rebroadcast stop event if needed. This function should be called only if the
-// CMICmnLLDBDebugger::CheckIfNeedToRebroadcastStopEvent() returned true.
+//++
+//------------------------------------------------------------------------------------
+// Details: Rebroadcast stop event if needed. This function should be called
+// only if the
+// CMICmnLLDBDebugger::CheckIfNeedToRebroadcastStopEvent() returned
+// true.
// Type: Method.
// Args: None.
// Return: None.
// Throws: None.
//--
-void
-CMICmnLLDBDebugger::RebroadcastStopEvent()
-{
- lldb::SBProcess process = CMICmnLLDBDebugSessionInfo::Instance().GetProcess();
- const bool include_expression_stops = false;
- const uint32_t nStopId = process.GetStopID(include_expression_stops);
- if (m_nLastStopId != nStopId)
- {
- lldb::SBEvent event = process.GetStopEventForStopID(nStopId);
- process.GetBroadcaster().BroadcastEvent(event);
- }
+void CMICmnLLDBDebugger::RebroadcastStopEvent() {
+ lldb::SBProcess process = CMICmnLLDBDebugSessionInfo::Instance().GetProcess();
+ const bool include_expression_stops = false;
+ const uint32_t nStopId = process.GetStopID(include_expression_stops);
+ if (m_nLastStopId != nStopId) {
+ lldb::SBEvent event = process.GetStopEventForStopID(nStopId);
+ process.GetBroadcaster().BroadcastEvent(event);
+ }
}
-//++ ------------------------------------------------------------------------------------
+//++
+//------------------------------------------------------------------------------------
// Details: Initialize the LLDB Debugger object.
// Type: Method.
// Args: None.
@@ -338,44 +349,45 @@ CMICmnLLDBDebugger::RebroadcastStopEvent()
// MIstatus::failure - Functionality failed.
// Throws: None.
//--
-bool
-CMICmnLLDBDebugger::InitSBDebugger()
-{
- m_lldbDebugger = lldb::SBDebugger::Create(false);
- if (!m_lldbDebugger.IsValid())
- {
- SetErrorDescription(MIRSRC(IDS_LLDBDEBUGGER_ERR_INVALIDDEBUGGER));
- return MIstatus::failure;
- }
+bool CMICmnLLDBDebugger::InitSBDebugger() {
+ m_lldbDebugger = lldb::SBDebugger::Create(false);
+ if (!m_lldbDebugger.IsValid()) {
+ SetErrorDescription(MIRSRC(IDS_LLDBDEBUGGER_ERR_INVALIDDEBUGGER));
+ return MIstatus::failure;
+ }
- m_lldbDebugger.GetCommandInterpreter().SetPromptOnQuit(false);
+ m_lldbDebugger.GetCommandInterpreter().SetPromptOnQuit(false);
- return MIstatus::success;
+ return MIstatus::success;
}
-//++ ------------------------------------------------------------------------------------
-// Details: Set the LLDB Debugger's std in, err and out streams. (Not implemented left
-// here for reference. Was called in the CMICmnLLDBDebugger::Initialize() )
+//++
+//------------------------------------------------------------------------------------
+// Details: Set the LLDB Debugger's std in, err and out streams. (Not
+// implemented left
+// here for reference. Was called in the
+// CMICmnLLDBDebugger::Initialize() )
// Type: Method.
// Args: None.
// Return: MIstatus::success - Functionality succeeded.
// MIstatus::failure - Functionality failed.
// Throws: None.
//--
-bool
-CMICmnLLDBDebugger::InitStdStreams()
-{
- // This is not required when operating the MI driver's code as it has its own
- // streams. Setting the Stdin for the lldbDebugger especially on LINUX will cause
- // another thread to run and partially consume stdin data meant for MI stdin handler
- // m_lldbDebugger.SetErrorFileHandle( m_pClientDriver->GetStderr(), false );
- // m_lldbDebugger.SetOutputFileHandle( m_pClientDriver->GetStdout(), false );
- // m_lldbDebugger.SetInputFileHandle( m_pClientDriver->GetStdin(), false );
-
- return MIstatus::success;
+bool CMICmnLLDBDebugger::InitStdStreams() {
+ // This is not required when operating the MI driver's code as it has its own
+ // streams. Setting the Stdin for the lldbDebugger especially on LINUX will
+ // cause
+ // another thread to run and partially consume stdin data meant for MI stdin
+ // handler
+ // m_lldbDebugger.SetErrorFileHandle( m_pClientDriver->GetStderr(), false );
+ // m_lldbDebugger.SetOutputFileHandle( m_pClientDriver->GetStdout(), false );
+ // m_lldbDebugger.SetInputFileHandle( m_pClientDriver->GetStdin(), false );
+
+ return MIstatus::success;
}
-//++ ------------------------------------------------------------------------------------
+//++
+//------------------------------------------------------------------------------------
// Details: Set up the events from the SBDebugger's we would like to listen to.
// Type: Method.
// Args: None.
@@ -383,74 +395,94 @@ CMICmnLLDBDebugger::InitStdStreams()
// MIstatus::failure - Functionality failed.
// Throws: None.
//--
-bool
-CMICmnLLDBDebugger::InitSBListener()
-{
- m_lldbListener = m_lldbDebugger.GetListener();
- if (!m_lldbListener.IsValid())
- {
- SetErrorDescription(MIRSRC(IDS_LLDBDEBUGGER_ERR_INVALIDLISTENER));
- return MIstatus::failure;
- }
-
- const CMIUtilString strDbgId("CMICmnLLDBDebugger1");
- MIuint eventMask = lldb::SBTarget::eBroadcastBitBreakpointChanged | lldb::SBTarget::eBroadcastBitModulesLoaded |
- lldb::SBTarget::eBroadcastBitModulesUnloaded | lldb::SBTarget::eBroadcastBitWatchpointChanged |
- lldb::SBTarget::eBroadcastBitSymbolsLoaded;
- bool bOk = RegisterForEvent(strDbgId, CMIUtilString(lldb::SBTarget::GetBroadcasterClassName()), eventMask);
-
- eventMask = lldb::SBThread::eBroadcastBitStackChanged;
- bOk = bOk && RegisterForEvent(strDbgId, CMIUtilString(lldb::SBThread::GetBroadcasterClassName()), eventMask);
-
- eventMask = lldb::SBProcess::eBroadcastBitStateChanged | lldb::SBProcess::eBroadcastBitInterrupt |
- lldb::SBProcess::eBroadcastBitSTDOUT | lldb::SBProcess::eBroadcastBitSTDERR | lldb::SBProcess::eBroadcastBitProfileData |
- lldb::SBProcess::eBroadcastBitStructuredData;
- bOk = bOk && RegisterForEvent(strDbgId, CMIUtilString(lldb::SBProcess::GetBroadcasterClassName()), eventMask);
-
- eventMask = lldb::SBCommandInterpreter::eBroadcastBitQuitCommandReceived | lldb::SBCommandInterpreter::eBroadcastBitThreadShouldExit |
- lldb::SBCommandInterpreter::eBroadcastBitAsynchronousOutputData |
- lldb::SBCommandInterpreter::eBroadcastBitAsynchronousErrorData;
- bOk = bOk && RegisterForEvent(strDbgId, m_lldbDebugger.GetCommandInterpreter().GetBroadcaster(), eventMask);
-
- return bOk;
+bool CMICmnLLDBDebugger::InitSBListener() {
+ m_lldbListener = m_lldbDebugger.GetListener();
+ if (!m_lldbListener.IsValid()) {
+ SetErrorDescription(MIRSRC(IDS_LLDBDEBUGGER_ERR_INVALIDLISTENER));
+ return MIstatus::failure;
+ }
+
+ const CMIUtilString strDbgId("CMICmnLLDBDebugger1");
+ MIuint eventMask = lldb::SBTarget::eBroadcastBitBreakpointChanged |
+ lldb::SBTarget::eBroadcastBitModulesLoaded |
+ lldb::SBTarget::eBroadcastBitModulesUnloaded |
+ lldb::SBTarget::eBroadcastBitWatchpointChanged |
+ lldb::SBTarget::eBroadcastBitSymbolsLoaded;
+ bool bOk = RegisterForEvent(
+ strDbgId, CMIUtilString(lldb::SBTarget::GetBroadcasterClassName()),
+ eventMask);
+
+ eventMask = lldb::SBThread::eBroadcastBitStackChanged;
+ bOk = bOk &&
+ RegisterForEvent(
+ strDbgId, CMIUtilString(lldb::SBThread::GetBroadcasterClassName()),
+ eventMask);
+
+ eventMask = lldb::SBProcess::eBroadcastBitStateChanged |
+ lldb::SBProcess::eBroadcastBitInterrupt |
+ lldb::SBProcess::eBroadcastBitSTDOUT |
+ lldb::SBProcess::eBroadcastBitSTDERR |
+ lldb::SBProcess::eBroadcastBitProfileData |
+ lldb::SBProcess::eBroadcastBitStructuredData;
+ bOk = bOk &&
+ RegisterForEvent(
+ strDbgId, CMIUtilString(lldb::SBProcess::GetBroadcasterClassName()),
+ eventMask);
+
+ eventMask = lldb::SBCommandInterpreter::eBroadcastBitQuitCommandReceived |
+ lldb::SBCommandInterpreter::eBroadcastBitThreadShouldExit |
+ lldb::SBCommandInterpreter::eBroadcastBitAsynchronousOutputData |
+ lldb::SBCommandInterpreter::eBroadcastBitAsynchronousErrorData;
+ bOk = bOk &&
+ RegisterForEvent(
+ strDbgId, m_lldbDebugger.GetCommandInterpreter().GetBroadcaster(),
+ eventMask);
+
+ return bOk;
}
-//++ ------------------------------------------------------------------------------------
-// Details: Register with the debugger, the SBListener, the type of events you are interested
+//++
+//------------------------------------------------------------------------------------
+// Details: Register with the debugger, the SBListener, the type of events you
+// are interested
// in. Others, like commands, may have already set the mask.
// Type: Method.
-// Args: vClientName - (R) ID of the client who wants these events set.
+// Args: vClientName - (R) ID of the client who wants these events
+// set.
// vBroadcasterClass - (R) The SBBroadcaster's class name.
// vEventMask - (R) The mask of events to listen for.
// Return: MIstatus::success - Functionality succeeded.
// MIstatus::failure - Functionality failed.
// Throws: None.
//--
-bool
-CMICmnLLDBDebugger::RegisterForEvent(const CMIUtilString &vClientName, const CMIUtilString &vBroadcasterClass, const MIuint vEventMask)
-{
- MIuint existingMask = 0;
- if (!BroadcasterGetMask(vBroadcasterClass, existingMask))
- return MIstatus::failure;
-
- if (!ClientSaveMask(vClientName, vBroadcasterClass, vEventMask))
- return MIstatus::failure;
-
- const char *pBroadCasterName = vBroadcasterClass.c_str();
- MIuint eventMask = vEventMask;
- eventMask += existingMask;
- const MIuint result = m_lldbListener.StartListeningForEventClass(m_lldbDebugger, pBroadCasterName, eventMask);
- if (result == 0)
- {
- SetErrorDescription(CMIUtilString::Format(MIRSRC(IDS_LLDBDEBUGGER_ERR_STARTLISTENER), pBroadCasterName));
- return MIstatus::failure;
- }
+bool CMICmnLLDBDebugger::RegisterForEvent(
+ const CMIUtilString &vClientName, const CMIUtilString &vBroadcasterClass,
+ const MIuint vEventMask) {
+ MIuint existingMask = 0;
+ if (!BroadcasterGetMask(vBroadcasterClass, existingMask))
+ return MIstatus::failure;
+
+ if (!ClientSaveMask(vClientName, vBroadcasterClass, vEventMask))
+ return MIstatus::failure;
+
+ const char *pBroadCasterName = vBroadcasterClass.c_str();
+ MIuint eventMask = vEventMask;
+ eventMask += existingMask;
+ const MIuint result = m_lldbListener.StartListeningForEventClass(
+ m_lldbDebugger, pBroadCasterName, eventMask);
+ if (result == 0) {
+ SetErrorDescription(CMIUtilString::Format(
+ MIRSRC(IDS_LLDBDEBUGGER_ERR_STARTLISTENER), pBroadCasterName));
+ return MIstatus::failure;
+ }
- return BroadcasterSaveMask(vBroadcasterClass, eventMask);
+ return BroadcasterSaveMask(vBroadcasterClass, eventMask);
}
-//++ ------------------------------------------------------------------------------------
-// Details: Register with the debugger, the SBListener, the type of events you are interested
+//++
+//------------------------------------------------------------------------------------
+// Details: Register with the debugger, the SBListener, the type of events you
+// are interested
// in. Others, like commands, may have already set the mask.
// Type: Method.
// Args: vClientName - (R) ID of the client who wants these events set.
@@ -460,85 +492,93 @@ CMICmnLLDBDebugger::RegisterForEvent(const CMIUtilString &vClientName, const CMI
// MIstatus::failure - Functionality failed.
// Throws: None.
//--
-bool
-CMICmnLLDBDebugger::RegisterForEvent(const CMIUtilString &vClientName, const lldb::SBBroadcaster &vBroadcaster, const MIuint vEventMask)
-{
- const char *pBroadcasterName = vBroadcaster.GetName();
- if (pBroadcasterName == nullptr)
- {
- SetErrorDescription(CMIUtilString::Format(MIRSRC(IDS_LLDBDEBUGGER_ERR_BROADCASTER_NAME), MIRSRC(IDS_WORD_INVALIDNULLPTR)));
- return MIstatus::failure;
- }
- CMIUtilString broadcasterName(pBroadcasterName);
- if (broadcasterName.length() == 0)
- {
- SetErrorDescription(CMIUtilString::Format(MIRSRC(IDS_LLDBDEBUGGER_ERR_BROADCASTER_NAME), MIRSRC(IDS_WORD_INVALIDEMPTY)));
- return MIstatus::failure;
- }
+bool CMICmnLLDBDebugger::RegisterForEvent(
+ const CMIUtilString &vClientName, const lldb::SBBroadcaster &vBroadcaster,
+ const MIuint vEventMask) {
+ const char *pBroadcasterName = vBroadcaster.GetName();
+ if (pBroadcasterName == nullptr) {
+ SetErrorDescription(
+ CMIUtilString::Format(MIRSRC(IDS_LLDBDEBUGGER_ERR_BROADCASTER_NAME),
+ MIRSRC(IDS_WORD_INVALIDNULLPTR)));
+ return MIstatus::failure;
+ }
+ CMIUtilString broadcasterName(pBroadcasterName);
+ if (broadcasterName.length() == 0) {
+ SetErrorDescription(
+ CMIUtilString::Format(MIRSRC(IDS_LLDBDEBUGGER_ERR_BROADCASTER_NAME),
+ MIRSRC(IDS_WORD_INVALIDEMPTY)));
+ return MIstatus::failure;
+ }
- MIuint existingMask = 0;
- if (!BroadcasterGetMask(broadcasterName, existingMask))
- return MIstatus::failure;
+ MIuint existingMask = 0;
+ if (!BroadcasterGetMask(broadcasterName, existingMask))
+ return MIstatus::failure;
- if (!ClientSaveMask(vClientName, broadcasterName, vEventMask))
- return MIstatus::failure;
+ if (!ClientSaveMask(vClientName, broadcasterName, vEventMask))
+ return MIstatus::failure;
- MIuint eventMask = vEventMask;
- eventMask += existingMask;
- const MIuint result = m_lldbListener.StartListeningForEvents(vBroadcaster, eventMask);
- if (result == 0)
- {
- SetErrorDescription(CMIUtilString::Format(MIRSRC(IDS_LLDBDEBUGGER_ERR_STARTLISTENER), pBroadcasterName));
- return MIstatus::failure;
- }
+ MIuint eventMask = vEventMask;
+ eventMask += existingMask;
+ const MIuint result =
+ m_lldbListener.StartListeningForEvents(vBroadcaster, eventMask);
+ if (result == 0) {
+ SetErrorDescription(CMIUtilString::Format(
+ MIRSRC(IDS_LLDBDEBUGGER_ERR_STARTLISTENER), pBroadcasterName));
+ return MIstatus::failure;
+ }
- return BroadcasterSaveMask(broadcasterName, eventMask);
+ return BroadcasterSaveMask(broadcasterName, eventMask);
}
-//++ ------------------------------------------------------------------------------------
-// Details: Unregister with the debugger, the SBListener, the type of events you are no
-// longer interested in. Others, like commands, may still remain interested so
+//++
+//------------------------------------------------------------------------------------
+// Details: Unregister with the debugger, the SBListener, the type of events you
+// are no
+// longer interested in. Others, like commands, may still remain
+// interested so
// an event may not necessarily be stopped.
// Type: Method.
-// Args: vClientName - (R) ID of the client who no longer requires these events.
+// Args: vClientName - (R) ID of the client who no longer requires
+// these events.
// vBroadcasterClass - (R) The SBBroadcaster's class name.
// Return: MIstatus::success - Functionality succeeded.
// MIstatus::failure - Functionality failed.
// Throws: None.
//--
-bool
-CMICmnLLDBDebugger::UnregisterForEvent(const CMIUtilString &vClientName, const CMIUtilString &vBroadcasterClass)
-{
- MIuint clientsEventMask = 0;
- if (!ClientGetTheirMask(vClientName, vBroadcasterClass, clientsEventMask))
- return MIstatus::failure;
- if (!ClientRemoveTheirMask(vClientName, vBroadcasterClass))
- return MIstatus::failure;
-
- const MIuint otherClientsEventMask = ClientGetMaskForAllClients(vBroadcasterClass);
- MIuint newEventMask = 0;
- for (MIuint i = 0; i < 32; i++)
- {
- const MIuint bit = 1 << i;
- const MIuint clientBit = bit & clientsEventMask;
- const MIuint othersBit = bit & otherClientsEventMask;
- if ((clientBit != 0) && (othersBit == 0))
- {
- newEventMask += clientBit;
- }
- }
+bool CMICmnLLDBDebugger::UnregisterForEvent(
+ const CMIUtilString &vClientName, const CMIUtilString &vBroadcasterClass) {
+ MIuint clientsEventMask = 0;
+ if (!ClientGetTheirMask(vClientName, vBroadcasterClass, clientsEventMask))
+ return MIstatus::failure;
+ if (!ClientRemoveTheirMask(vClientName, vBroadcasterClass))
+ return MIstatus::failure;
- const char *pBroadCasterName = vBroadcasterClass.c_str();
- if (!m_lldbListener.StopListeningForEventClass(m_lldbDebugger, pBroadCasterName, newEventMask))
- {
- SetErrorDescription(CMIUtilString::Format(MIRSRC(IDS_LLDBDEBUGGER_ERR_STOPLISTENER), vClientName.c_str(), pBroadCasterName));
- return MIstatus::failure;
+ const MIuint otherClientsEventMask =
+ ClientGetMaskForAllClients(vBroadcasterClass);
+ MIuint newEventMask = 0;
+ for (MIuint i = 0; i < 32; i++) {
+ const MIuint bit = 1 << i;
+ const MIuint clientBit = bit & clientsEventMask;
+ const MIuint othersBit = bit & otherClientsEventMask;
+ if ((clientBit != 0) && (othersBit == 0)) {
+ newEventMask += clientBit;
}
+ }
+
+ const char *pBroadCasterName = vBroadcasterClass.c_str();
+ if (!m_lldbListener.StopListeningForEventClass(
+ m_lldbDebugger, pBroadCasterName, newEventMask)) {
+ SetErrorDescription(
+ CMIUtilString::Format(MIRSRC(IDS_LLDBDEBUGGER_ERR_STOPLISTENER),
+ vClientName.c_str(), pBroadCasterName));
+ return MIstatus::failure;
+ }
- return BroadcasterSaveMask(vBroadcasterClass, otherClientsEventMask);
+ return BroadcasterSaveMask(vBroadcasterClass, otherClientsEventMask);
}
-//++ ------------------------------------------------------------------------------------
+//++
+//------------------------------------------------------------------------------------
// Details: Given the SBBroadcaster class name retrieve it's current event mask.
// Type: Method.
// Args: vBroadcasterClass - (R) The SBBroadcaster's class name.
@@ -547,27 +587,28 @@ CMICmnLLDBDebugger::UnregisterForEvent(const CMIUtilString &vClientName, const C
// MIstatus::failure - Functionality failed.
// Throws: None.
//--
-bool
-CMICmnLLDBDebugger::BroadcasterGetMask(const CMIUtilString &vBroadcasterClass, MIuint &vwEventMask) const
-{
- vwEventMask = 0;
-
- if (vBroadcasterClass.empty())
- {
- SetErrorDescription(CMIUtilString::Format(MIRSRC(IDS_LLDBDEBUGGER_ERR_INVALIDBROADCASTER), vBroadcasterClass.c_str()));
- return MIstatus::failure;
- }
+bool CMICmnLLDBDebugger::BroadcasterGetMask(
+ const CMIUtilString &vBroadcasterClass, MIuint &vwEventMask) const {
+ vwEventMask = 0;
+
+ if (vBroadcasterClass.empty()) {
+ SetErrorDescription(
+ CMIUtilString::Format(MIRSRC(IDS_LLDBDEBUGGER_ERR_INVALIDBROADCASTER),
+ vBroadcasterClass.c_str()));
+ return MIstatus::failure;
+ }
- const MapBroadcastClassNameToEventMask_t::const_iterator it = m_mapBroadcastClassNameToEventMask.find(vBroadcasterClass);
- if (it != m_mapBroadcastClassNameToEventMask.end())
- {
- vwEventMask = (*it).second;
- }
+ const MapBroadcastClassNameToEventMask_t::const_iterator it =
+ m_mapBroadcastClassNameToEventMask.find(vBroadcasterClass);
+ if (it != m_mapBroadcastClassNameToEventMask.end()) {
+ vwEventMask = (*it).second;
+ }
- return MIstatus::success;
+ return MIstatus::success;
}
-//++ ------------------------------------------------------------------------------------
+//++
+//------------------------------------------------------------------------------------
// Details: Remove the event mask for the specified SBBroadcaster class name.
// Type: Method.
// Args: vBroadcasterClass - (R) The SBBroadcaster's class name.
@@ -575,19 +616,19 @@ CMICmnLLDBDebugger::BroadcasterGetMask(const CMIUtilString &vBroadcasterClass, M
// MIstatus::failure - Functionality failed.
// Throws: None.
//--
-bool
-CMICmnLLDBDebugger::BroadcasterRemoveMask(const CMIUtilString &vBroadcasterClass)
-{
- MapBroadcastClassNameToEventMask_t::const_iterator it = m_mapBroadcastClassNameToEventMask.find(vBroadcasterClass);
- if (it != m_mapBroadcastClassNameToEventMask.end())
- {
- m_mapBroadcastClassNameToEventMask.erase(it);
- }
-
- return MIstatus::success;
+bool CMICmnLLDBDebugger::BroadcasterRemoveMask(
+ const CMIUtilString &vBroadcasterClass) {
+ MapBroadcastClassNameToEventMask_t::const_iterator it =
+ m_mapBroadcastClassNameToEventMask.find(vBroadcasterClass);
+ if (it != m_mapBroadcastClassNameToEventMask.end()) {
+ m_mapBroadcastClassNameToEventMask.erase(it);
+ }
+
+ return MIstatus::success;
}
-//++ ------------------------------------------------------------------------------------
+//++
+//------------------------------------------------------------------------------------
// Details: Given the SBBroadcaster class name save it's current event mask.
// Type: Method.
// Args: vBroadcasterClass - (R) The SBBroadcaster's class name.
@@ -596,81 +637,83 @@ CMICmnLLDBDebugger::BroadcasterRemoveMask(const CMIUtilString &vBroadcasterClass
// MIstatus::failure - Functionality failed.
// Throws: None.
//--
-bool
-CMICmnLLDBDebugger::BroadcasterSaveMask(const CMIUtilString &vBroadcasterClass, const MIuint vEventMask)
-{
- if (vBroadcasterClass.empty())
- {
- SetErrorDescription(CMIUtilString::Format(MIRSRC(IDS_LLDBDEBUGGER_ERR_INVALIDBROADCASTER), vBroadcasterClass.c_str()));
- return MIstatus::failure;
- }
+bool CMICmnLLDBDebugger::BroadcasterSaveMask(
+ const CMIUtilString &vBroadcasterClass, const MIuint vEventMask) {
+ if (vBroadcasterClass.empty()) {
+ SetErrorDescription(
+ CMIUtilString::Format(MIRSRC(IDS_LLDBDEBUGGER_ERR_INVALIDBROADCASTER),
+ vBroadcasterClass.c_str()));
+ return MIstatus::failure;
+ }
- BroadcasterRemoveMask(vBroadcasterClass);
- MapPairBroadcastClassNameToEventMask_t pr(vBroadcasterClass, vEventMask);
- m_mapBroadcastClassNameToEventMask.insert(pr);
+ BroadcasterRemoveMask(vBroadcasterClass);
+ MapPairBroadcastClassNameToEventMask_t pr(vBroadcasterClass, vEventMask);
+ m_mapBroadcastClassNameToEventMask.insert(pr);
- return MIstatus::success;
+ return MIstatus::success;
}
-//++ ------------------------------------------------------------------------------------
-// Details: Iterate all the clients who have registered event masks against particular
+//++
+//------------------------------------------------------------------------------------
+// Details: Iterate all the clients who have registered event masks against
+// particular
// SBBroadcasters and build up the mask that is for all of them.
// Type: Method.
// Args: vBroadcasterClass - (R) The broadcaster to retrieve the mask for.
// Return: MIuint - Event mask.
// Throws: None.
//--
-MIuint
-CMICmnLLDBDebugger::ClientGetMaskForAllClients(const CMIUtilString &vBroadcasterClass) const
-{
- MIuint mask = 0;
- MapIdToEventMask_t::const_iterator it = m_mapIdToEventMask.begin();
- while (it != m_mapIdToEventMask.end())
- {
- const CMIUtilString &rId((*it).first);
- if (rId.find(vBroadcasterClass) != std::string::npos)
- {
- const MIuint clientsMask = (*it).second;
- mask |= clientsMask;
- }
-
- // Next
- ++it;
+MIuint CMICmnLLDBDebugger::ClientGetMaskForAllClients(
+ const CMIUtilString &vBroadcasterClass) const {
+ MIuint mask = 0;
+ MapIdToEventMask_t::const_iterator it = m_mapIdToEventMask.begin();
+ while (it != m_mapIdToEventMask.end()) {
+ const CMIUtilString &rId((*it).first);
+ if (rId.find(vBroadcasterClass) != std::string::npos) {
+ const MIuint clientsMask = (*it).second;
+ mask |= clientsMask;
}
- return mask;
+ // Next
+ ++it;
+ }
+
+ return mask;
}
-//++ ------------------------------------------------------------------------------------
+//++
+//------------------------------------------------------------------------------------
// Details: Given the client save its particular event requirements.
// Type: Method.
// Args: vClientName - (R) The Client's unique ID.
-// vBroadcasterClass - (R) The SBBroadcaster's class name targeted for the events.
+// vBroadcasterClass - (R) The SBBroadcaster's class name targeted for
+// the events.
// vEventMask - (R) The mask of events to listen for.
// Return: MIstatus::success - Functionality succeeded.
// MIstatus::failure - Functionality failed.
// Throws: None.
//--
-bool
-CMICmnLLDBDebugger::ClientSaveMask(const CMIUtilString &vClientName, const CMIUtilString &vBroadcasterClass, const MIuint vEventMask)
-{
- if (vClientName.empty())
- {
- SetErrorDescription(CMIUtilString::Format(MIRSRC(IDS_LLDBDEBUGGER_ERR_INVALIDCLIENTNAME), vClientName.c_str()));
- return MIstatus::failure;
- }
+bool CMICmnLLDBDebugger::ClientSaveMask(const CMIUtilString &vClientName,
+ const CMIUtilString &vBroadcasterClass,
+ const MIuint vEventMask) {
+ if (vClientName.empty()) {
+ SetErrorDescription(CMIUtilString::Format(
+ MIRSRC(IDS_LLDBDEBUGGER_ERR_INVALIDCLIENTNAME), vClientName.c_str()));
+ return MIstatus::failure;
+ }
- CMIUtilString strId(vBroadcasterClass);
- strId += vClientName;
+ CMIUtilString strId(vBroadcasterClass);
+ strId += vClientName;
- ClientRemoveTheirMask(vClientName, vBroadcasterClass);
- MapPairIdToEventMask_t pr(strId, vEventMask);
- m_mapIdToEventMask.insert(pr);
+ ClientRemoveTheirMask(vClientName, vBroadcasterClass);
+ MapPairIdToEventMask_t pr(strId, vEventMask);
+ m_mapIdToEventMask.insert(pr);
- return MIstatus::success;
+ return MIstatus::success;
}
-//++ ------------------------------------------------------------------------------------
+//++
+//------------------------------------------------------------------------------------
// Details: Given the client remove it's particular event requirements.
// Type: Method.
// Args: vClientName - (R) The Client's unique ID.
@@ -679,29 +722,29 @@ CMICmnLLDBDebugger::ClientSaveMask(const CMIUtilString &vClientName, const CMIUt
// MIstatus::failure - Functionality failed.
// Throws: None.
//--
-bool
-CMICmnLLDBDebugger::ClientRemoveTheirMask(const CMIUtilString &vClientName, const CMIUtilString &vBroadcasterClass)
-{
- if (vClientName.empty())
- {
- SetErrorDescription(CMIUtilString::Format(MIRSRC(IDS_LLDBDEBUGGER_ERR_INVALIDCLIENTNAME), vClientName.c_str()));
- return MIstatus::failure;
- }
+bool CMICmnLLDBDebugger::ClientRemoveTheirMask(
+ const CMIUtilString &vClientName, const CMIUtilString &vBroadcasterClass) {
+ if (vClientName.empty()) {
+ SetErrorDescription(CMIUtilString::Format(
+ MIRSRC(IDS_LLDBDEBUGGER_ERR_INVALIDCLIENTNAME), vClientName.c_str()));
+ return MIstatus::failure;
+ }
- CMIUtilString strId(vBroadcasterClass);
- strId += vClientName;
+ CMIUtilString strId(vBroadcasterClass);
+ strId += vClientName;
- const MapIdToEventMask_t::const_iterator it = m_mapIdToEventMask.find(strId);
- if (it != m_mapIdToEventMask.end())
- {
- m_mapIdToEventMask.erase(it);
- }
+ const MapIdToEventMask_t::const_iterator it = m_mapIdToEventMask.find(strId);
+ if (it != m_mapIdToEventMask.end()) {
+ m_mapIdToEventMask.erase(it);
+ }
- return MIstatus::success;
+ return MIstatus::success;
}
-//++ ------------------------------------------------------------------------------------
-// Details: Retrieve the client's event mask used for on a particular SBBroadcaster.
+//++
+//------------------------------------------------------------------------------------
+// Details: Retrieve the client's event mask used for on a particular
+// SBBroadcaster.
// Type: Method.
// Args: vClientName - (R) The Client's unique ID.
// vBroadcasterClass - (R) The SBBroadcaster's class name.
@@ -710,105 +753,115 @@ CMICmnLLDBDebugger::ClientRemoveTheirMask(const CMIUtilString &vClientName, cons
// MIstatus::failure - Functionality failed.
// Throws: None.
//--
-bool
-CMICmnLLDBDebugger::ClientGetTheirMask(const CMIUtilString &vClientName, const CMIUtilString &vBroadcasterClass, MIuint &vwEventMask)
-{
- vwEventMask = 0;
-
- if (vClientName.empty())
- {
- SetErrorDescription(CMIUtilString::Format(MIRSRC(IDS_LLDBDEBUGGER_ERR_INVALIDCLIENTNAME), vClientName.c_str()));
- return MIstatus::failure;
- }
+bool CMICmnLLDBDebugger::ClientGetTheirMask(
+ const CMIUtilString &vClientName, const CMIUtilString &vBroadcasterClass,
+ MIuint &vwEventMask) {
+ vwEventMask = 0;
+
+ if (vClientName.empty()) {
+ SetErrorDescription(CMIUtilString::Format(
+ MIRSRC(IDS_LLDBDEBUGGER_ERR_INVALIDCLIENTNAME), vClientName.c_str()));
+ return MIstatus::failure;
+ }
- const CMIUtilString strId(vBroadcasterClass + vClientName);
- const MapIdToEventMask_t::const_iterator it = m_mapIdToEventMask.find(strId);
- if (it != m_mapIdToEventMask.end())
- {
- vwEventMask = (*it).second;
- }
+ const CMIUtilString strId(vBroadcasterClass + vClientName);
+ const MapIdToEventMask_t::const_iterator it = m_mapIdToEventMask.find(strId);
+ if (it != m_mapIdToEventMask.end()) {
+ vwEventMask = (*it).second;
+ }
- SetErrorDescription(CMIUtilString::Format(MIRSRC(IDS_LLDBDEBUGGER_ERR_CLIENTNOTREGISTERED), vClientName.c_str()));
+ SetErrorDescription(CMIUtilString::Format(
+ MIRSRC(IDS_LLDBDEBUGGER_ERR_CLIENTNOTREGISTERED), vClientName.c_str()));
- return MIstatus::failure;
+ return MIstatus::failure;
}
-//++ ------------------------------------------------------------------------------------
-// Details: Momentarily wait for an events being broadcast and inspect those that do
-// come this way. Check if the target should exit event if so start shutting
-// down this thread and the application. Any other events pass on to the
+//++
+//------------------------------------------------------------------------------------
+// Details: Momentarily wait for an events being broadcast and inspect those
+// that do
+// come this way. Check if the target should exit event if so start
+// shutting
+// down this thread and the application. Any other events pass on to
+// the
// Out-of-band handler to further determine what kind of event arrived.
// This function runs in the thread "MI debugger event".
// Type: Method.
-// Args: vrbIsAlive - (W) False = yes exit event monitoring thread, true = continue.
+// Args: vrbIsAlive - (W) False = yes exit event monitoring thread, true =
+// continue.
// Return: MIstatus::success - Functional succeeded.
// MIstatus::failure - Functional failed.
// Throws: None.
//--
-bool
-CMICmnLLDBDebugger::MonitorSBListenerEvents(bool &vrbIsAlive)
-{
- vrbIsAlive = true;
-
- // Lock the mutex of event queue
- // Note that it should be locked while we are in CMICmnLLDBDebugger::MonitorSBListenerEvents to
- // avoid a race condition with CMICmnLLDBDebugger::WaitForHandleEvent
- std::unique_lock<std::mutex> lock(m_mutexEventQueue);
-
- lldb::SBEvent event;
- const bool bGotEvent = m_lldbListener.GetNextEvent(event);
- if (!bGotEvent)
- {
- // Notify that we are finished and unlock the mutex of event queue before sleeping
- m_conditionEventQueueEmpty.notify_one();
- lock.unlock();
-
- // Wait a bit to reduce CPU load
- const std::chrono::milliseconds time(1);
- std::this_thread::sleep_for(time);
- return MIstatus::success;
- }
- assert(event.IsValid());
- assert(event.GetBroadcaster().IsValid());
-
- // Debugging
- m_pLog->WriteLog(CMIUtilString::Format("##### An event occurred: %s", event.GetBroadcasterClass()));
-
- bool bHandledEvent = false;
- 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);
- }
-
- if (!bHandledEvent)
- {
- const CMIUtilString msg(CMIUtilString::Format(MIRSRC(IDS_LLDBDEBUGGER_WRN_UNKNOWN_EVENT), event.GetBroadcasterClass()));
- m_pLog->WriteLog(msg);
- }
-
- if (!bOk)
- m_pLog->WriteLog(CMICmnLLDBDebuggerHandleEvents::Instance().GetErrorDescription());
-
+bool CMICmnLLDBDebugger::MonitorSBListenerEvents(bool &vrbIsAlive) {
+ vrbIsAlive = true;
+
+ // Lock the mutex of event queue
+ // Note that it should be locked while we are in
+ // CMICmnLLDBDebugger::MonitorSBListenerEvents to
+ // avoid a race condition with CMICmnLLDBDebugger::WaitForHandleEvent
+ std::unique_lock<std::mutex> lock(m_mutexEventQueue);
+
+ lldb::SBEvent event;
+ const bool bGotEvent = m_lldbListener.GetNextEvent(event);
+ if (!bGotEvent) {
+ // Notify that we are finished and unlock the mutex of event queue before
+ // sleeping
+ m_conditionEventQueueEmpty.notify_one();
+ lock.unlock();
+
+ // Wait a bit to reduce CPU load
+ const std::chrono::milliseconds time(1);
+ std::this_thread::sleep_for(time);
return MIstatus::success;
+ }
+ assert(event.IsValid());
+ assert(event.GetBroadcaster().IsValid());
+
+ // Debugging
+ m_pLog->WriteLog(CMIUtilString::Format("##### An event occurred: %s",
+ event.GetBroadcasterClass()));
+
+ bool bHandledEvent = false;
+ 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);
+ }
+
+ if (!bHandledEvent) {
+ const CMIUtilString msg(
+ CMIUtilString::Format(MIRSRC(IDS_LLDBDEBUGGER_WRN_UNKNOWN_EVENT),
+ event.GetBroadcasterClass()));
+ m_pLog->WriteLog(msg);
+ }
+
+ if (!bOk)
+ m_pLog->WriteLog(
+ CMICmnLLDBDebuggerHandleEvents::Instance().GetErrorDescription());
+
+ return MIstatus::success;
}
-//++ ------------------------------------------------------------------------------------
+//++
+//------------------------------------------------------------------------------------
// Details: The main worker method for this thread.
// Type: Method.
-// Args: vrbIsAlive - (W) True = *this thread is working, false = thread has exited.
+// Args: vrbIsAlive - (W) True = *this thread is working, false = thread has
+// exited.
// Return: MIstatus::success - Functional succeeded.
// MIstatus::failure - Functional failed.
// Throws: None.
//--
-bool
-CMICmnLLDBDebugger::ThreadRun(bool &vrbIsAlive)
-{
- return MonitorSBListenerEvents(vrbIsAlive);
+bool CMICmnLLDBDebugger::ThreadRun(bool &vrbIsAlive) {
+ return MonitorSBListenerEvents(vrbIsAlive);
}
-//++ ------------------------------------------------------------------------------------
+//++
+//------------------------------------------------------------------------------------
// Details: Let this thread clean up after itself.
// Type: Method.
// Args:
@@ -816,26 +869,22 @@ CMICmnLLDBDebugger::ThreadRun(bool &vrbIsAlive)
// MIstatus::failure - Functionality failed.
// Throws: None.
//--
-bool
-CMICmnLLDBDebugger::ThreadFinish()
-{
- return MIstatus::success;
-}
+bool CMICmnLLDBDebugger::ThreadFinish() { return MIstatus::success; }
-//++ ------------------------------------------------------------------------------------
+//++
+//------------------------------------------------------------------------------------
// Details: Retrieve *this thread object's name.
// Type: Overridden.
// Args: None.
// Return: CMIUtilString & - Text.
// Throws: None.
//--
-const CMIUtilString &
-CMICmnLLDBDebugger::ThreadGetName() const
-{
- return m_constStrThisThreadId;
+const CMIUtilString &CMICmnLLDBDebugger::ThreadGetName() const {
+ return m_constStrThisThreadId;
}
-//++ ------------------------------------------------------------------------------------
+//++
+//------------------------------------------------------------------------------------
// Details: Loads lldb-mi formatters
// Type: Method.
// Args: None.
@@ -843,25 +892,27 @@ CMICmnLLDBDebugger::ThreadGetName() const
// false - Functionality failed.
// Throws: None.
//--
-bool
-CMICmnLLDBDebugger::LoadMIFormatters(lldb::SBTypeCategory miCategory)
-{
- if (!MI_add_summary(miCategory, "char", MI_char_summary_provider,
- lldb::eTypeOptionHideValue | lldb::eTypeOptionSkipPointers))
- return false;
-
- if (!MI_add_summary(miCategory, "unsigned char", MI_char_summary_provider,
- lldb::eTypeOptionHideValue | lldb::eTypeOptionSkipPointers))
- return false;
-
- if (!MI_add_summary(miCategory, "signed char", MI_char_summary_provider,
- lldb::eTypeOptionHideValue | lldb::eTypeOptionSkipPointers))
- return false;
-
- return true;
+bool CMICmnLLDBDebugger::LoadMIFormatters(lldb::SBTypeCategory miCategory) {
+ if (!MI_add_summary(miCategory, "char", MI_char_summary_provider,
+ lldb::eTypeOptionHideValue |
+ lldb::eTypeOptionSkipPointers))
+ return false;
+
+ if (!MI_add_summary(miCategory, "unsigned char", MI_char_summary_provider,
+ lldb::eTypeOptionHideValue |
+ lldb::eTypeOptionSkipPointers))
+ return false;
+
+ if (!MI_add_summary(miCategory, "signed char", MI_char_summary_provider,
+ lldb::eTypeOptionHideValue |
+ lldb::eTypeOptionSkipPointers))
+ return false;
+
+ return true;
}
-//++ ------------------------------------------------------------------------------------
+//++
+//------------------------------------------------------------------------------------
// Details: Registers lldb-mi custom summary providers
// Type: Method.
// Args: None.
@@ -869,19 +920,17 @@ CMICmnLLDBDebugger::LoadMIFormatters(lldb::SBTypeCategory miCategory)
// false - Functionality failed.
// Throws: None.
//--
-bool
-CMICmnLLDBDebugger::RegisterMISummaryProviders()
-{
- static const char* miCategoryName = "lldb-mi";
- lldb::SBTypeCategory miCategory = m_lldbDebugger.CreateCategory(miCategoryName);
- if (!miCategory.IsValid())
- return false;
-
- if (!LoadMIFormatters(miCategory))
- {
- m_lldbDebugger.DeleteCategory(miCategoryName);
- return false;
- }
- miCategory.SetEnabled(true);
- return true;
+bool CMICmnLLDBDebugger::RegisterMISummaryProviders() {
+ static const char *miCategoryName = "lldb-mi";
+ lldb::SBTypeCategory miCategory =
+ m_lldbDebugger.CreateCategory(miCategoryName);
+ if (!miCategory.IsValid())
+ return false;
+
+ if (!LoadMIFormatters(miCategory)) {
+ m_lldbDebugger.DeleteCategory(miCategoryName);
+ return false;
+ }
+ miCategory.SetEnabled(true);
+ return true;
}