diff options
Diffstat (limited to 'tools/lldb-mi/MICmnLLDBDebugger.cpp')
-rw-r--r-- | tools/lldb-mi/MICmnLLDBDebugger.cpp | 1097 |
1 files changed, 559 insertions, 538 deletions
diff --git a/tools/lldb-mi/MICmnLLDBDebugger.cpp b/tools/lldb-mi/MICmnLLDBDebugger.cpp index f68f5083054b..273b805156f4 100644 --- a/tools/lldb-mi/MICmnLLDBDebugger.cpp +++ b/tools/lldb-mi/MICmnLLDBDebugger.cpp @@ -8,20 +8,20 @@ //===----------------------------------------------------------------------===// //++ -// File: MICmnLLDBDebugger.cpp +// File: MICmnLLDBDebugger.cpp // -// Overview: CMICmnLLDBDebugger implementation. +// Overview: CMICmnLLDBDebugger implementation. // -// Environment: Compilers: Visual C++ 12. -// gcc (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1 -// Libraries: See MIReadmetxt. +// Environment: Compilers: Visual C++ 12. +// gcc (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1 +// Libraries: See MIReadmetxt. // -// Copyright: None. +// Copyright: None. //-- // Third party headers: #include <lldb/API/SBTarget.h> -#include <lldb/API/SBThread.h> +#include <lldb/API/SBThread.h> #include <lldb/API/SBProcess.h> #include <lldb/API/SBCommandInterpreter.h> @@ -36,672 +36,693 @@ #include "MIUtilSingletonHelper.h" //++ ------------------------------------------------------------------------------------ -// Details: CMICmnLLDBDebugger constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. +// Details: CMICmnLLDBDebugger constructor. +// Type: Method. +// Args: None. +// Return: None. +// Throws: None. //-- -CMICmnLLDBDebugger::CMICmnLLDBDebugger( void ) -: m_constStrThisThreadId( "MI debugger event" ) +CMICmnLLDBDebugger::CMICmnLLDBDebugger(void) + : m_constStrThisThreadId("MI debugger event") { } //++ ------------------------------------------------------------------------------------ -// Details: CMICmnLLDBDebugger destructor. -// Type: Overridable. -// Args: None. -// Return: None. -// Throws: None. +// Details: CMICmnLLDBDebugger destructor. +// Type: Overridable. +// Args: None. +// Return: None. +// Throws: None. //-- -CMICmnLLDBDebugger::~CMICmnLLDBDebugger( void ) +CMICmnLLDBDebugger::~CMICmnLLDBDebugger(void) { - Shutdown(); + Shutdown(); } //++ ------------------------------------------------------------------------------------ -// Details: Initialize resources for *this debugger object. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. +// Details: Initialize resources for *this debugger object. +// Type: Method. +// Args: None. +// Return: MIstatus::success - Functionality succeeded. +// MIstatus::failure - Functionality failed. +// Throws: None. //-- -bool CMICmnLLDBDebugger::Initialize( void ) +bool +CMICmnLLDBDebugger::Initialize(void) { - 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 ); - } - - // 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(); - - m_bInitialized = bOk; - - if( !bOk && !HaveErrorDescription() ) - { - CMIUtilString strInitError( CMIUtilString::Format( MIRSRC( IDS_MI_INIT_ERR_LLDBDEBUGGER ), errMsg.c_str() ) ); - SetErrorDescription( strInitError ); - } - - return bOk; + 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); + } + + // 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(); + + 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. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. +// Details: Release resources for *this debugger object. +// Type: Method. +// Args: None. +// Return: MIstatus::success - Functionality succeeded. +// MIstatus::failure - Functionality failed. +// Throws: None. //-- -bool CMICmnLLDBDebugger::Shutdown( void ) +bool +CMICmnLLDBDebugger::Shutdown(void) { - 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 - m_lldbDebugger.DeleteTarget( CMICmnLLDBDebugSessionInfo::Instance().m_lldbTarget ); - - // 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; -} + 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 + m_lldbDebugger.DeleteTarget(CMICmnLLDBDebugSessionInfo::Instance().m_lldbTarget); + + // 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. +// 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( void ) +lldb::SBDebugger & +CMICmnLLDBDebugger::GetTheDebugger(void) { - return m_lldbDebugger; + 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. +// 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( void ) +lldb::SBListener & +CMICmnLLDBDebugger::GetTheListener(void) { - return m_lldbListener; + return m_lldbListener; } //++ ------------------------------------------------------------------------------------ -// 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. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. +// 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. +// Return: MIstatus::success - Functionality succeeded. +// MIstatus::failure - Functionality failed. +// Throws: None. //-- -bool CMICmnLLDBDebugger::SetDriver( const CMIDriverBase & vClientDriver ) +bool +CMICmnLLDBDebugger::SetDriver(const CMIDriverBase &vClientDriver) { - m_pClientDriver = const_cast< 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. +// 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( void ) const +CMIDriverBase & +CMICmnLLDBDebugger::GetDriver(void) const { - return *m_pClientDriver; + return *m_pClientDriver; } - + //++ ------------------------------------------------------------------------------------ -// Details: Initialize the LLDB Debugger object. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. +// Details: Initialize the LLDB Debugger object. +// Type: Method. +// Args: None. +// Return: MIstatus::success - Functionality succeeded. +// MIstatus::failure - Functionality failed. +// Throws: None. //-- -bool CMICmnLLDBDebugger::InitSBDebugger( void ) +bool +CMICmnLLDBDebugger::InitSBDebugger(void) { - m_lldbDebugger = lldb::SBDebugger::Create( false ); - if( m_lldbDebugger.IsValid() ) - return MIstatus::success; + m_lldbDebugger = lldb::SBDebugger::Create(false); + if (m_lldbDebugger.IsValid()) + return MIstatus::success; - SetErrorDescription( MIRSRC( IDS_LLDBDEBUGGER_ERR_INVALIDDEBUGGER ) ); - return MIstatus::failure; + SetErrorDescription(MIRSRC(IDS_LLDBDEBUGGER_ERR_INVALIDDEBUGGER)); + return MIstatus::failure; } //++ ------------------------------------------------------------------------------------ -// 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. +// 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( void ) +bool +CMICmnLLDBDebugger::InitStdStreams(void) { - // 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; + // 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 to listent to. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. +// Type: Method. +// Args: None. +// Return: MIstatus::success - Functionality succeeded. +// MIstatus::failure - Functionality failed. +// Throws: None. //-- -bool CMICmnLLDBDebugger::InitSBListener( void ) +bool +CMICmnLLDBDebugger::InitSBListener(void) { - 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; - 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; - 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, CMIUtilString( lldb::SBCommandInterpreter::GetBroadcasterClass() ), eventMask ); - - return bOk; + 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; + 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; + 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, CMIUtilString(lldb::SBCommandInterpreter::GetBroadcasterClass()), eventMask); + + return bOk; } //++ ------------------------------------------------------------------------------------ -// 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. -// 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. +// 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. +// 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 ) +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 MIchar * 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 ); + MIuint existingMask = 0; + if (!BroadcasterGetMask(vBroadcasterClass, existingMask)) + return MIstatus::failure; + + if (!ClientSaveMask(vClientName, vBroadcasterClass, vEventMask)) + return MIstatus::failure; + + const MIchar *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); } //++ ------------------------------------------------------------------------------------ -// 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. -// vBroadcaster - (R) An SBBroadcaster's derived class. -// vEventMask - (R) The mask of events to listen for. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. +// 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. +// vBroadcaster - (R) An SBBroadcaster's derived class. +// 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 lldb::SBBroadcaster & vBroadcaster, const MIuint vEventMask ) +bool +CMICmnLLDBDebugger::RegisterForEvent(const CMIUtilString &vClientName, const lldb::SBBroadcaster &vBroadcaster, const MIuint vEventMask) { - const MIchar * pBroadcasterName = vBroadcaster.GetName(); - if( pBroadcasterName == nullptr ) - { - SetErrorDescription( CMIUtilString::Format( MIRSRC( IDS_LLDBDEBUGGER_ERR_BROARDCASTER_NAME ), MIRSRC( IDS_WORD_INVALIDNULLPTR ) ) ); - return MIstatus::failure; - } - CMIUtilString broadcasterName( pBroadcasterName ); - if( broadcasterName.length() == 0 ) - { - SetErrorDescription( CMIUtilString::Format( MIRSRC( IDS_LLDBDEBUGGER_ERR_BROARDCASTER_NAME ), MIRSRC( IDS_WORD_INVALIDEMPTY ) ) ); - return MIstatus::failure; - } - - MIuint existingMask = 0; - if( !BroadcasterGetMask( broadcasterName, existingMask ) ) - 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; - } - - return BroadcasterSaveMask( broadcasterName, eventMask ); + const MIchar *pBroadcasterName = vBroadcaster.GetName(); + if (pBroadcasterName == nullptr) + { + SetErrorDescription(CMIUtilString::Format(MIRSRC(IDS_LLDBDEBUGGER_ERR_BROARDCASTER_NAME), MIRSRC(IDS_WORD_INVALIDNULLPTR))); + return MIstatus::failure; + } + CMIUtilString broadcasterName(pBroadcasterName); + if (broadcasterName.length() == 0) + { + SetErrorDescription(CMIUtilString::Format(MIRSRC(IDS_LLDBDEBUGGER_ERR_BROARDCASTER_NAME), MIRSRC(IDS_WORD_INVALIDEMPTY))); + return MIstatus::failure; + } + + MIuint existingMask = 0; + if (!BroadcasterGetMask(broadcasterName, existingMask)) + 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; + } + + 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 -// an event may not necessarily be stopped. -// Type: Method. -// 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. +// 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. +// 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 ) +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; - } - } - - const MIchar * 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 ); + 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; + } + } + + const MIchar *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); } //++ ------------------------------------------------------------------------------------ -// Details: Given the SBBroadcaster class name retrieve it's current event mask. -// Type: Method. -// Args: vBroadcasterClass - (R) The SBBroadcaster's class name. -// vEventMask - (W) The mask of events to listen for. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. +// Details: Given the SBBroadcaster class name retrieve it's current event mask. +// Type: Method. +// Args: vBroadcasterClass - (R) The SBBroadcaster's class name. +// vEventMask - (W) The mask of events to listen for. +// Return: MIstatus::success - Functionality succeeded. +// MIstatus::failure - Functionality failed. +// Throws: None. //-- -bool CMICmnLLDBDebugger::BroadcasterGetMask( const CMIUtilString & vBroadcasterClass, MIuint & vwEventMask ) const +bool +CMICmnLLDBDebugger::BroadcasterGetMask(const CMIUtilString &vBroadcasterClass, MIuint &vwEventMask) const { - vwEventMask = 0; + vwEventMask = 0; - if( vBroadcasterClass.empty() ) - { - SetErrorDescription( CMIUtilString::Format( MIRSRC( IDS_LLDBDEBUGGER_ERR_INVALIDBROADCASTER ), vBroadcasterClass.c_str() ) ); - return MIstatus::failure; - } + 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. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. +// Details: Remove the event mask for the specified SBBroadcaster class name. +// Type: Method. +// Args: vBroadcasterClass - (R) The SBBroadcaster's class name. +// Return: MIstatus::success - Functionality succeeded. +// MIstatus::failure - Functionality failed. +// Throws: None. //-- -bool CMICmnLLDBDebugger::BroadcasterRemoveMask( const CMIUtilString & vBroadcasterClass ) +bool +CMICmnLLDBDebugger::BroadcasterRemoveMask(const CMIUtilString &vBroadcasterClass) { - MapBroadcastClassNameToEventMask_t::const_iterator it = m_mapBroadcastClassNameToEventMask.find( vBroadcasterClass ); - if( it != m_mapBroadcastClassNameToEventMask.end() ) - { - m_mapBroadcastClassNameToEventMask.erase( it ); - } + MapBroadcastClassNameToEventMask_t::const_iterator it = m_mapBroadcastClassNameToEventMask.find(vBroadcasterClass); + if (it != m_mapBroadcastClassNameToEventMask.end()) + { + m_mapBroadcastClassNameToEventMask.erase(it); + } - return MIstatus::success; + 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. -// vEventMask - (R) The mask of events to listen for. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. +// Details: Given the SBBroadcaster class name save it's current event mask. +// Type: Method. +// Args: 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::BroadcasterSaveMask( const CMIUtilString & vBroadcasterClass, const MIuint vEventMask ) +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; - } + 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 -// 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. +// 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 +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.c_str() ) != std::string::npos ) - { - const MIuint clientsMask = (*it).second; - mask |= clientsMask; - } - - // Next - ++it; - } - - return mask; + 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.c_str()) != std::string::npos) + { + const MIuint clientsMask = (*it).second; + mask |= clientsMask; + } + + // 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. -// vEventMask - (R) The mask of events to listen for. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. +// 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. +// 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 ) +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; - } + 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. -// vBroadcasterClass - (R) The SBBroadcaster's class name. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. +// Details: Given the client remove it's particular event requirements. +// Type: Method. +// Args: vClientName - (R) The Client's unique ID. +// vBroadcasterClass - (R) The SBBroadcaster's class name. +// Return: MIstatus::success - Functionality succeeded. +// MIstatus::failure - Functionality failed. +// Throws: None. //-- -bool CMICmnLLDBDebugger::ClientRemoveTheirMask( const CMIUtilString & vClientName, const CMIUtilString & vBroadcasterClass ) +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; - - const MapIdToEventMask_t::const_iterator it = m_mapIdToEventMask.find( strId ); - if( it != m_mapIdToEventMask.end() ) - { - m_mapIdToEventMask.erase( it ); - } - - return MIstatus::success; + if (vClientName.empty()) + { + SetErrorDescription(CMIUtilString::Format(MIRSRC(IDS_LLDBDEBUGGER_ERR_INVALIDCLIENTNAME), vClientName.c_str())); + return MIstatus::failure; + } + + CMIUtilString strId(vBroadcasterClass); + strId += vClientName; + + const MapIdToEventMask_t::const_iterator it = m_mapIdToEventMask.find(strId); + if (it != m_mapIdToEventMask.end()) + { + m_mapIdToEventMask.erase(it); + } + + return MIstatus::success; } //++ ------------------------------------------------------------------------------------ -// 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. -// vwEventMask - (W) The client's mask. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. +// 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. +// vwEventMask - (W) The client's mask. +// Return: MIstatus::success - Functionality succeeded. +// MIstatus::failure - Functionality failed. +// Throws: None. //-- -bool CMICmnLLDBDebugger::ClientGetTheirMask( const CMIUtilString & vClientName, const CMIUtilString & vBroadcasterClass, MIuint & vwEventMask ) +bool +CMICmnLLDBDebugger::ClientGetTheirMask(const CMIUtilString &vClientName, const CMIUtilString &vBroadcasterClass, MIuint &vwEventMask) { - vwEventMask = 0; + vwEventMask = 0; - if( vClientName.empty() ) - { - SetErrorDescription( CMIUtilString::Format( MIRSRC( IDS_LLDBDEBUGGER_ERR_INVALIDCLIENTNAME ), vClientName.c_str() ) ); - return MIstatus::failure; - } + if (vClientName.empty()) + { + SetErrorDescription(CMIUtilString::Format(MIRSRC(IDS_LLDBDEBUGGER_ERR_INVALIDCLIENTNAME), vClientName.c_str())); + return MIstatus::failure; + } - CMIUtilString strId( vBroadcasterClass.c_str() ); - strId += vClientName; + CMIUtilString strId(vBroadcasterClass.c_str()); + strId += vClientName; - const MapIdToEventMask_t::const_iterator it = m_mapIdToEventMask.find( strId ); - if( it != m_mapIdToEventMask.end() ) - { - vwEventMask = (*it).second; - } + 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_CLIENTNOTREGISTERD ), vClientName.c_str() ) ); + SetErrorDescription(CMIUtilString::Format(MIRSRC(IDS_LLDBDEBUGGER_ERR_CLIENTNOTREGISTERD), 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 -// Out-of-band handler to futher 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. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. +// 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 futher 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. +// Return: MIstatus::success - Functional succeeded. +// MIstatus::failure - Functional failed. +// Throws: None. //-- -bool CMICmnLLDBDebugger::MonitorSBListenerEvents( bool & vrbIsAlive ) +bool +CMICmnLLDBDebugger::MonitorSBListenerEvents(bool &vrbIsAlive) { - vrbIsAlive = true; - - lldb::SBEvent event; - const bool bGotEvent = m_lldbListener.GetNextEvent( event ); - if ( !bGotEvent || !event.IsValid() ) - { - const std::chrono::milliseconds time( 1 ); - std::this_thread::sleep_for( time ); - return MIstatus::success; - } - if( !event.GetBroadcaster().IsValid() ) - return MIstatus::success; - - // Debugging - m_pLog->WriteLog( CMIUtilString::Format( "##### An event occurred: %s", event.GetBroadcasterClass() ) ); - - bool bHandledEvent = false; - bool bExitAppEvent = false; - const bool bOk = CMICmnLLDBDebuggerHandleEvents::Instance().HandleEvent( event, bHandledEvent, bExitAppEvent ); - 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() ); - } - - if( bExitAppEvent ) - { - // Set the application to shutdown - m_pClientDriver->SetExitApplicationFlag( true ); - - // Kill *this thread - vrbIsAlive = false; - } - - return bOk; + vrbIsAlive = true; + + lldb::SBEvent event; + const bool bGotEvent = m_lldbListener.GetNextEvent(event); + if (!bGotEvent || !event.IsValid()) + { + const std::chrono::milliseconds time(1); + std::this_thread::sleep_for(time); + return MIstatus::success; + } + if (!event.GetBroadcaster().IsValid()) + return MIstatus::success; + + // Debugging + m_pLog->WriteLog(CMIUtilString::Format("##### An event occurred: %s", event.GetBroadcasterClass())); + + bool bHandledEvent = false; + bool bExitAppEvent = false; + const bool bOk = CMICmnLLDBDebuggerHandleEvents::Instance().HandleEvent(event, bHandledEvent, bExitAppEvent); + 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()); + } + + if (bExitAppEvent) + { + // Set the application to shutdown + m_pClientDriver->SetExitApplicationFlag(true); + + // Kill *this thread + vrbIsAlive = false; + } + + return bOk; } //++ ------------------------------------------------------------------------------------ -// Details: The main worker method for this thread. -// Type: Method. -// Args: vrbIsAlive = (W) True = *this thread is working, false = thread has exited. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. +// Details: The main worker method for this thread. +// Type: Method. +// 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 ) +bool +CMICmnLLDBDebugger::ThreadRun(bool &vrbIsAlive) { - return MonitorSBListenerEvents( vrbIsAlive ); + return MonitorSBListenerEvents(vrbIsAlive); } //++ ------------------------------------------------------------------------------------ -// Details: Let this thread clean up after itself. -// Type: Method. -// Args: -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. +// Details: Let this thread clean up after itself. +// Type: Method. +// Args: +// Return: MIstatus::success - Functionality succeeded. +// MIstatus::failure - Functionality failed. +// Throws: None. //-- -bool CMICmnLLDBDebugger::ThreadFinish( void ) +bool +CMICmnLLDBDebugger::ThreadFinish(void) { - return MIstatus::success; + return MIstatus::success; } //++ ------------------------------------------------------------------------------------ -// Details: Retrieve *this thread object's name. -// Type: Overridden. -// Args: None. -// Return: CMIUtilString & - Text. -// Throws: None. +// Details: Retrieve *this thread object's name. +// Type: Overridden. +// Args: None. +// Return: CMIUtilString & - Text. +// Throws: None. //-- -const CMIUtilString & CMICmnLLDBDebugger::ThreadGetName( void ) const +const CMIUtilString & +CMICmnLLDBDebugger::ThreadGetName(void) const { - return m_constStrThisThreadId; + return m_constStrThisThreadId; } |