| //===-- MICmnLLDBDebugger.h -------------------------------------*- C++ -*-===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #pragma once |
| |
| // Third party headers |
| #include "lldb/API/SBDebugger.h" |
| #include "lldb/API/SBEvent.h" |
| #include "lldb/API/SBListener.h" |
| #include <condition_variable> |
| #include <map> |
| #include <mutex> |
| |
| // In-house headers: |
| #include "MICmnBase.h" |
| #include "MIUtilSingletonBase.h" |
| #include "MIUtilThreadBaseStd.h" |
| |
| // Declarations: |
| class CMIDriverBase; |
| class CMICmnLLDBDebuggerHandleEvents; |
| |
| //++ |
| //============================================================================ |
| // Details: MI proxy/adapter for the LLDB public SBDebugger API. The CMIDriver |
| // requires *this object. Command classes make calls on *this object |
| // to facilitate their work effort. The instance runs in its own worker |
| // thread. |
| // A singleton class. |
| //-- |
| class CMICmnLLDBDebugger : public CMICmnBase, |
| public CMIUtilThreadActiveObjBase, |
| public MI::ISingleton<CMICmnLLDBDebugger> { |
| friend class MI::ISingleton<CMICmnLLDBDebugger>; |
| |
| // Methods: |
| public: |
| bool Initialize() override; |
| bool Shutdown() override; |
| |
| bool SetDriver(const CMIDriverBase &vClientDriver); |
| CMIDriverBase &GetDriver() const; |
| lldb::SBDebugger &GetTheDebugger(); |
| lldb::SBListener &GetTheListener(); |
| void WaitForHandleEvent(); |
| bool CheckIfNeedToRebroadcastStopEvent(); |
| void RebroadcastStopEvent(); |
| |
| // MI Commands can use these functions to listen for events they require |
| bool RegisterForEvent(const CMIUtilString &vClientName, |
| const CMIUtilString &vBroadcasterClass, |
| const MIuint vEventMask); |
| bool UnregisterForEvent(const CMIUtilString &vClientName, |
| const CMIUtilString &vBroadcasterClass); |
| bool RegisterForEvent(const CMIUtilString &vClientName, |
| const lldb::SBBroadcaster &vBroadcaster, |
| const MIuint vEventMask); |
| bool UnregisterForEvent(const CMIUtilString &vClientName, |
| const lldb::SBBroadcaster &vBroadcaster); |
| |
| // Overridden: |
| public: |
| // From CMIUtilThreadActiveObjBase |
| const CMIUtilString &ThreadGetName() const override; |
| |
| // Overridden: |
| protected: |
| // From CMIUtilThreadActiveObjBase |
| bool ThreadRun(bool &vrIsAlive) override; |
| bool ThreadFinish() override; |
| |
| // Typedefs: |
| private: |
| typedef std::map<CMIUtilString, MIuint> MapBroadcastClassNameToEventMask_t; |
| typedef std::pair<CMIUtilString, MIuint> |
| MapPairBroadcastClassNameToEventMask_t; |
| typedef std::map<CMIUtilString, MIuint> MapIdToEventMask_t; |
| typedef std::pair<CMIUtilString, MIuint> MapPairIdToEventMask_t; |
| |
| // Methods: |
| private: |
| /* ctor */ CMICmnLLDBDebugger(); |
| /* ctor */ CMICmnLLDBDebugger(const CMICmnLLDBDebugger &); |
| void operator=(const CMICmnLLDBDebugger &); |
| |
| bool InitSBDebugger(); |
| bool InitSBListener(); |
| bool InitStdStreams(); |
| bool MonitorSBListenerEvents(bool &vrbYesExit); |
| |
| bool BroadcasterGetMask(const CMIUtilString &vBroadcasterClass, |
| MIuint &vEventMask) const; |
| bool BroadcasterRemoveMask(const CMIUtilString &vBroadcasterClass); |
| bool BroadcasterSaveMask(const CMIUtilString &vBroadcasterClass, |
| const MIuint vEventMask); |
| |
| MIuint |
| ClientGetMaskForAllClients(const CMIUtilString &vBroadcasterClass) const; |
| bool ClientSaveMask(const CMIUtilString &vClientName, |
| const CMIUtilString &vBroadcasterClass, |
| const MIuint vEventMask); |
| bool ClientRemoveTheirMask(const CMIUtilString &vClientName, |
| const CMIUtilString &vBroadcasterClass); |
| bool ClientGetTheirMask(const CMIUtilString &vClientName, |
| const CMIUtilString &vBroadcasterClass, |
| MIuint &vwEventMask); |
| bool LoadMIFormatters(lldb::SBTypeCategory miCategory); |
| bool RegisterMISummaryProviders(); |
| // Overridden: |
| private: |
| // From CMICmnBase |
| /* dtor */ ~CMICmnLLDBDebugger() override; |
| |
| // Attributes: |
| private: |
| CMIDriverBase |
| *m_pClientDriver; // The driver that wants to use *this LLDB debugger |
| lldb::SBDebugger m_lldbDebugger; // SBDebugger is the primordial object that |
| // creates SBTargets and provides access to |
| // them |
| lldb::SBListener m_lldbListener; // API clients can register its own listener |
| // to debugger events |
| const CMIUtilString m_constStrThisThreadId; |
| MapBroadcastClassNameToEventMask_t m_mapBroadcastClassNameToEventMask; |
| MapIdToEventMask_t m_mapIdToEventMask; |
| std::mutex m_mutexEventQueue; |
| std::condition_variable m_conditionEventQueueEmpty; |
| uint32_t m_nLastStopId; |
| }; |