diff options
Diffstat (limited to 'tools/lldb-mi/MICmdInvoker.cpp')
-rw-r--r-- | tools/lldb-mi/MICmdInvoker.cpp | 498 |
1 files changed, 255 insertions, 243 deletions
diff --git a/tools/lldb-mi/MICmdInvoker.cpp b/tools/lldb-mi/MICmdInvoker.cpp index 41f9f77542a3..c415fbaf18b5 100644 --- a/tools/lldb-mi/MICmdInvoker.cpp +++ b/tools/lldb-mi/MICmdInvoker.cpp @@ -8,15 +8,15 @@ //===----------------------------------------------------------------------===// //++ -// File: MICmdInvoker.cpp +// File: MICmdInvoker.cpp // -// Overview: CMICmdInvoker implementation. +// Overview: CMICmdInvoker 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. //-- // In-house headers: @@ -28,306 +28,318 @@ #include "MIDriver.h" //++ ------------------------------------------------------------------------------------ -// Details: CMICmdInvoker constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. +// Details: CMICmdInvoker constructor. +// Type: Method. +// Args: None. +// Return: None. +// Throws: None. //-- -CMICmdInvoker::CMICmdInvoker( void ) -: m_rStreamOut( CMICmnStreamStdout::Instance() ) +CMICmdInvoker::CMICmdInvoker(void) + : m_rStreamOut(CMICmnStreamStdout::Instance()) { } //++ ------------------------------------------------------------------------------------ -// Details: CMICmdInvoker destructor. -// Type: Overridable. -// Args: None. -// Return: None. -// Throws: None. +// Details: CMICmdInvoker destructor. +// Type: Overridable. +// Args: None. +// Return: None. +// Throws: None. //-- -CMICmdInvoker::~CMICmdInvoker( void ) +CMICmdInvoker::~CMICmdInvoker(void) { - Shutdown(); + Shutdown(); } //++ ------------------------------------------------------------------------------------ -// Details: Initialize resources for *this Command Invoker. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. +// Details: Initialize resources for *this Command Invoker. +// Type: Method. +// Args: None. +// Return: MIstatus::success - Functional succeeded. +// MIstatus::failure - Functional failed. +// Throws: None. //-- -bool CMICmdInvoker::Initialize( void ) +bool +CMICmdInvoker::Initialize(void) { - m_clientUsageRefCnt++; + m_clientUsageRefCnt++; - if( m_bInitialized ) - return MIstatus::success; + if (m_bInitialized) + return MIstatus::success; - m_bInitialized = true; + m_bInitialized = true; - return MIstatus::success; + return MIstatus::success; } //++ ------------------------------------------------------------------------------------ -// Details: Release resources for *this Stdin stream. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. +// Details: Release resources for *this Stdin stream. +// Type: Method. +// Args: None. +// Return: MIstatus::success - Functional succeeded. +// MIstatus::failure - Functional failed. +// Throws: None. //-- -bool CMICmdInvoker::Shutdown( void ) +bool +CMICmdInvoker::Shutdown(void) { - if( --m_clientUsageRefCnt > 0 ) - return MIstatus::success; - - if( !m_bInitialized ) - return MIstatus::success; + if (--m_clientUsageRefCnt > 0) + return MIstatus::success; - CmdDeleteAll(); + if (!m_bInitialized) + return MIstatus::success; - m_bInitialized = false; + CmdDeleteAll(); - return MIstatus::success; -} + m_bInitialized = false; + + return MIstatus::success; +} //++ ------------------------------------------------------------------------------------ -// Details: Empty the map of invoked commands doing work. Command objects are deleted too. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. +// Details: Empty the map of invoked commands doing work. Command objects are deleted too. +// Type: Method. +// Args: None. +// Return: None. +// Throws: None. //-- -void CMICmdInvoker::CmdDeleteAll( void ) +void +CMICmdInvoker::CmdDeleteAll(void) { - CMICmdMgr & rMgr = CMICmdMgr::Instance(); - MapCmdIdToCmd_t::const_iterator it = m_mapCmdIdToCmd.begin(); - while( it != m_mapCmdIdToCmd.end() ) - { - const MIuint cmdId( (*it).first ); MIunused( cmdId ); - CMICmdBase * pCmd = (*it).second; - const CMIUtilString & rCmdName( pCmd->GetCmdData().strMiCmd ); MIunused( rCmdName ); - rMgr.CmdDelete( pCmd->GetCmdData() ); - - // Next - ++it; - } - m_mapCmdIdToCmd.clear(); + CMICmdMgr &rMgr = CMICmdMgr::Instance(); + MapCmdIdToCmd_t::const_iterator it = m_mapCmdIdToCmd.begin(); + while (it != m_mapCmdIdToCmd.end()) + { + const MIuint cmdId((*it).first); + MIunused(cmdId); + CMICmdBase *pCmd = (*it).second; + const CMIUtilString &rCmdName(pCmd->GetCmdData().strMiCmd); + MIunused(rCmdName); + rMgr.CmdDelete(pCmd->GetCmdData()); + + // Next + ++it; + } + m_mapCmdIdToCmd.clear(); } //++ ------------------------------------------------------------------------------------ -// Details: Remove from the map of invoked commands doing work a command that has finished -// its work. The command object is deleted too. -// Type: Method. -// Args: vId - (R) Command object's unique ID. -// vbYesDeleteCmd - (R) True = Delete command object, false = delete via the Command Manager. -// Return: None. -// Throws: None. +// Details: Remove from the map of invoked commands doing work a command that has finished +// its work. The command object is deleted too. +// Type: Method. +// Args: vId - (R) Command object's unique ID. +// vbYesDeleteCmd - (R) True = Delete command object, false = delete via the Command Manager. +// Return: None. +// Throws: None. //-- -bool CMICmdInvoker::CmdDelete( const MIuint vId, const bool vbYesDeleteCmd /*= false*/ ) +bool +CMICmdInvoker::CmdDelete(const MIuint vId, const bool vbYesDeleteCmd /*= false*/) { - CMICmdMgr & rMgr = CMICmdMgr::Instance(); - MapCmdIdToCmd_t::const_iterator it = m_mapCmdIdToCmd.find( vId ); - if( it != m_mapCmdIdToCmd.end() ) - { - CMICmdBase * pCmd = (*it).second; - if( vbYesDeleteCmd ) - { - // Via registered interest command manager callback *this object to delete the command - m_mapCmdIdToCmd.erase( it ); - delete pCmd; - } - else - // Notify other interested object of this command's pending deletion - rMgr.CmdDelete( pCmd->GetCmdData() ); - } - - if( m_mapCmdIdToCmd.empty() ) - rMgr.CmdUnregisterForDeleteNotification( *this ); - - return MIstatus::success; + CMICmdMgr &rMgr = CMICmdMgr::Instance(); + MapCmdIdToCmd_t::const_iterator it = m_mapCmdIdToCmd.find(vId); + if (it != m_mapCmdIdToCmd.end()) + { + CMICmdBase *pCmd = (*it).second; + if (vbYesDeleteCmd) + { + // Via registered interest command manager callback *this object to delete the command + m_mapCmdIdToCmd.erase(it); + delete pCmd; + } + else + // Notify other interested object of this command's pending deletion + rMgr.CmdDelete(pCmd->GetCmdData()); + } + + if (m_mapCmdIdToCmd.empty()) + rMgr.CmdUnregisterForDeleteNotification(*this); + + return MIstatus::success; } //++ ------------------------------------------------------------------------------------ -// Details: Add to the map of invoked commands doing work a command that is about to -// start to do work. -// Type: Method. -// Args: vCmd - (R) Command object. -// Return: None. -// Throws: None. +// Details: Add to the map of invoked commands doing work a command that is about to +// start to do work. +// Type: Method. +// Args: vCmd - (R) Command object. +// Return: None. +// Throws: None. //-- -bool CMICmdInvoker::CmdAdd( const CMICmdBase & vCmd ) +bool +CMICmdInvoker::CmdAdd(const CMICmdBase &vCmd) { - if( m_mapCmdIdToCmd.empty() ) - { - CMICmdMgr & rMgr = CMICmdMgr::Instance(); - rMgr.CmdRegisterForDeleteNotification( *this ); - } + if (m_mapCmdIdToCmd.empty()) + { + CMICmdMgr &rMgr = CMICmdMgr::Instance(); + rMgr.CmdRegisterForDeleteNotification(*this); + } - const MIuint & cmdId( vCmd.GetCmdData().id ); - MapCmdIdToCmd_t::const_iterator it = m_mapCmdIdToCmd.find( cmdId ); - if( it != m_mapCmdIdToCmd.end() ) - return MIstatus::success; + const MIuint &cmdId(vCmd.GetCmdData().id); + MapCmdIdToCmd_t::const_iterator it = m_mapCmdIdToCmd.find(cmdId); + if (it != m_mapCmdIdToCmd.end()) + return MIstatus::success; - MapPairCmdIdToCmd_t pr( cmdId, const_cast< CMICmdBase *>( &vCmd )); - m_mapCmdIdToCmd.insert( pr ); + MapPairCmdIdToCmd_t pr(cmdId, const_cast<CMICmdBase *>(&vCmd)); + m_mapCmdIdToCmd.insert(pr); - return MIstatus::success; + return MIstatus::success; } //++ ------------------------------------------------------------------------------------ -// Details: Having previously had the potential command validated and found valid now -// get the command executed. -// If the Functionalityity returns MIstatus::failure call GetErrorDescription(). -// This function is used by the application's main thread. -// Type: Method. -// Args: vCmd - (RW) Command object. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. +// Details: Having previously had the potential command validated and found valid now +// get the command executed. +// If the Functionalityity returns MIstatus::failure call GetErrorDescription(). +// This function is used by the application's main thread. +// Type: Method. +// Args: vCmd - (RW) Command object. +// Return: MIstatus::success - Functionality succeeded. +// MIstatus::failure - Functionality failed. +// Throws: None. //-- -bool CMICmdInvoker::CmdExecute( CMICmdBase & vCmd ) +bool +CMICmdInvoker::CmdExecute(CMICmdBase &vCmd) { - bool bOk = CmdAdd( vCmd ); - - if( bOk && !vCmd.ParseArgs() ) - { - // Report command execution failed - const SMICmdData cmdData( vCmd.GetCmdData() ); - CmdStdout( cmdData ); - CmdCauseAppExit( vCmd ); - CmdDelete( cmdData.id ); - - // Proceed to wait or execute next command - return MIstatus::success; - } - - if( bOk && !vCmd.Execute() ) - { - // Report command execution failed - const SMICmdData cmdData( vCmd.GetCmdData() ); - CmdStdout( cmdData ); - CmdCauseAppExit( vCmd ); - CmdDelete( cmdData.id ); - - // Proceed to wait or execute next command - return MIstatus::success; - } - - bOk = CmdExecuteFinished( vCmd ); - - return bOk; + bool bOk = CmdAdd(vCmd); + + if (bOk && !vCmd.ParseArgs()) + { + // Report command execution failed + const SMICmdData cmdData(vCmd.GetCmdData()); + CmdStdout(cmdData); + CmdCauseAppExit(vCmd); + CmdDelete(cmdData.id); + + // Proceed to wait or execute next command + return MIstatus::success; + } + + if (bOk && !vCmd.Execute()) + { + // Report command execution failed + const SMICmdData cmdData(vCmd.GetCmdData()); + CmdStdout(cmdData); + CmdCauseAppExit(vCmd); + CmdDelete(cmdData.id); + + // Proceed to wait or execute next command + return MIstatus::success; + } + + bOk = CmdExecuteFinished(vCmd); + + return bOk; } //++ ------------------------------------------------------------------------------------ -// Details: Called when a command has finished its Execution() work either synchronously -// because the command executed was the type a non event type or asynchronoulsy -// via the command's callback (because of an SB Listener event). Needs to be called -// so that *this invoker call do some house keeping and then proceed to call -// the command's Acknowledge() function. -// Type: Method. -// Args: vCmd - (R) Command object. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. +// Details: Called when a command has finished its Execution() work either synchronously +// because the command executed was the type a non event type or asynchronoulsy +// via the command's callback (because of an SB Listener event). Needs to be called +// so that *this invoker call do some house keeping and then proceed to call +// the command's Acknowledge() function. +// Type: Method. +// Args: vCmd - (R) Command object. +// Return: MIstatus::success - Functionality succeeded. +// MIstatus::failure - Functionality failed. +// Throws: None. //-- -bool CMICmdInvoker::CmdExecuteFinished( CMICmdBase & vCmd ) +bool +CMICmdInvoker::CmdExecuteFinished(CMICmdBase &vCmd) { - // Command finished now get the command to gather it's information and form the MI - // Result record - if( !vCmd.Acknowledge() ) - { - // Report command acknowledge functionality failed - const SMICmdData cmdData( vCmd.GetCmdData() ); - CmdStdout( cmdData ); - CmdCauseAppExit( vCmd ); - CmdDelete( cmdData.id ); - - // Proceed to wait or execute next command - return MIstatus::success; - } - - // Retrieve the command's latest data/information. Needed for commands of the event type so have - // a record of commands pending finishing execution. - const CMIUtilString & rMIResultRecord( vCmd.GetMIResultRecord() ); - SMICmdData cmdData( vCmd.GetCmdData() ); // Make a copy as the command will be deleted soon - cmdData.strMiCmdResultRecord = rMIResultRecord; // Precautionary copy as the command might forget to do this - if( vCmd.HasMIResultRecordExtra() ) - { - cmdData.bHasResultRecordExtra = true; - const CMIUtilString & rMIExtra( vCmd.GetMIResultRecordExtra() ); - cmdData.strMiCmdResultRecordExtra = rMIExtra; // Precautionary copy as the command might forget to do this - } - - // Send command's MI response to the client - bool bOk = CmdStdout( cmdData ); - - // Delete the command object as do not require anymore - bOk = bOk && CmdDelete( vCmd.GetCmdData().id ); - - return bOk; + // Command finished now get the command to gather it's information and form the MI + // Result record + if (!vCmd.Acknowledge()) + { + // Report command acknowledge functionality failed + const SMICmdData cmdData(vCmd.GetCmdData()); + CmdStdout(cmdData); + CmdCauseAppExit(vCmd); + CmdDelete(cmdData.id); + + // Proceed to wait or execute next command + return MIstatus::success; + } + + // Retrieve the command's latest data/information. Needed for commands of the event type so have + // a record of commands pending finishing execution. + const CMIUtilString &rMIResultRecord(vCmd.GetMIResultRecord()); + SMICmdData cmdData(vCmd.GetCmdData()); // Make a copy as the command will be deleted soon + cmdData.strMiCmdResultRecord = rMIResultRecord; // Precautionary copy as the command might forget to do this + if (vCmd.HasMIResultRecordExtra()) + { + cmdData.bHasResultRecordExtra = true; + const CMIUtilString &rMIExtra(vCmd.GetMIResultRecordExtra()); + cmdData.strMiCmdResultRecordExtra = rMIExtra; // Precautionary copy as the command might forget to do this + } + + // Send command's MI response to the client + bool bOk = CmdStdout(cmdData); + + // Delete the command object as do not require anymore + bOk = bOk && CmdDelete(vCmd.GetCmdData().id); + + return bOk; } //++ ------------------------------------------------------------------------------------ -// Details: If the MI Driver is not operating via a client i.e. Eclipse check the command -// on failure suggests the application exits. A command can be such that a -// failure cannot the allow the application to continue operating. -// Args: vCmd - (R) Command object. -// Return: None. -// Return: None. -// Throws: None. +// Details: If the MI Driver is not operating via a client i.e. Eclipse check the command +// on failure suggests the application exits. A command can be such that a +// failure cannot the allow the application to continue operating. +// Args: vCmd - (R) Command object. +// Return: None. +// Return: None. +// Throws: None. //-- -void CMICmdInvoker::CmdCauseAppExit( const CMICmdBase & vCmd ) const +void +CMICmdInvoker::CmdCauseAppExit(const CMICmdBase &vCmd) const { - if( vCmd.GetExitAppOnCommandFailure() ) - { - CMIDriver & rDriver( CMIDriver::Instance() ); - if( rDriver.IsDriverDebuggingArgExecutable() ) - { - rDriver.SetExitApplicationFlag( true ); - } - } + if (vCmd.GetExitAppOnCommandFailure()) + { + CMIDriver &rDriver(CMIDriver::Instance()); + if (rDriver.IsDriverDebuggingArgExecutable()) + { + rDriver.SetExitApplicationFlag(true); + } + } } //++ ------------------------------------------------------------------------------------ -// Details: Write to stdout and the Log file the command's MI formatted result. -// Type: vCmdData - (R) A command's information. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Return: None. -// Throws: None. +// Details: Write to stdout and the Log file the command's MI formatted result. +// Type: vCmdData - (R) A command's information. +// Return: MIstatus::success - Functionality succeeded. +// MIstatus::failure - Functionality failed. +// Return: None. +// Throws: None. //-- -bool CMICmdInvoker::CmdStdout( const SMICmdData & vCmdData ) const +bool +CMICmdInvoker::CmdStdout(const SMICmdData &vCmdData) const { - bool bOk = m_pLog->WriteLog( vCmdData.strMiCmdAll ); - const bool bLock = bOk && m_rStreamOut.Lock(); - bOk = bOk && bLock && m_rStreamOut.WriteMIResponse( vCmdData.strMiCmdResultRecord ); - if( bOk && vCmdData.bHasResultRecordExtra ) - { - bOk = m_rStreamOut.WriteMIResponse( vCmdData.strMiCmdResultRecordExtra ); - } - bOk = bLock && m_rStreamOut.Unlock(); - - return bOk; + bool bOk = m_pLog->WriteLog(vCmdData.strMiCmdAll); + const bool bLock = bOk && m_rStreamOut.Lock(); + bOk = bOk && bLock && m_rStreamOut.WriteMIResponse(vCmdData.strMiCmdResultRecord); + if (bOk && vCmdData.bHasResultRecordExtra) + { + bOk = m_rStreamOut.WriteMIResponse(vCmdData.strMiCmdResultRecordExtra); + } + bOk = bLock && m_rStreamOut.Unlock(); + + return bOk; } //++ ------------------------------------------------------------------------------------ -// Details: Required by the CMICmdMgr::ICmdDeleteCallback. *this object is registered -// with the Command Manager to receive callbacks when a command is being deleted. -// An object, *this invoker, does not delete a command object itself but calls -// the Command Manager to delete a command object. This function is the Invoker's -// called. -// The Invoker owns the command objects and so can delete them but must do it -// via the manager so other objects can be notified of the deletion. -// Type: Method. -// Args: vCmd - (RW) Command. -// Return: None. -// Throws: None. +// Details: Required by the CMICmdMgr::ICmdDeleteCallback. *this object is registered +// with the Command Manager to receive callbacks when a command is being deleted. +// An object, *this invoker, does not delete a command object itself but calls +// the Command Manager to delete a command object. This function is the Invoker's +// called. +// The Invoker owns the command objects and so can delete them but must do it +// via the manager so other objects can be notified of the deletion. +// Type: Method. +// Args: vCmd - (RW) Command. +// Return: None. +// Throws: None. //-- -void CMICmdInvoker::Delete( SMICmdData & vCmd ) +void +CMICmdInvoker::Delete(SMICmdData &vCmd) { - CmdDelete( vCmd.id, true ); + CmdDelete(vCmd.id, true); } |