| //===-- 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; | 
 | }; |