================ @@ -0,0 +1,119 @@ +//===-- DAPSessionManager.h ------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLDB_TOOLS_LLDB_DAP_DAPSESSIONMANAGER_H +#define LLDB_TOOLS_LLDB_DAP_DAPSESSIONMANAGER_H + +#include "lldb/API/SBBroadcaster.h" +#include "lldb/API/SBDebugger.h" +#include "lldb/API/SBTarget.h" +#include "lldb/Host/MainLoop.h" +#include "lldb/lldb-types.h" +#include "llvm/Support/Error.h" +#include <condition_variable> +#include <map> +#include <memory> +#include <mutex> +#include <optional> +#include <thread> +#include <vector> + +namespace lldb_dap { + +// Forward declarations +struct DAP; + +class ManagedEventThread { +public: + // Constructor declaration + ManagedEventThread(lldb::SBBroadcaster broadcaster, std::thread t); + + ~ManagedEventThread(); + + ManagedEventThread(const ManagedEventThread &) = delete; + ManagedEventThread &operator=(const ManagedEventThread &) = delete; + +private: + lldb::SBBroadcaster m_broadcaster; + std::thread m_event_thread; +}; + +/// Global DAP session manager. +class DAPSessionManager { +public: + /// Get the singleton instance of the DAP session manager. + static DAPSessionManager &GetInstance(); + + /// Register a DAP session. + void RegisterSession(lldb_private::MainLoop *loop, DAP *dap); + + /// Unregister a DAP session. + void UnregisterSession(lldb_private::MainLoop *loop); + + /// Get all active DAP sessions. + std::vector<DAP *> GetActiveSessions(); + + /// Disconnect all active sessions. + void DisconnectAllSessions(); + + /// Wait for all sessions to finish disconnecting. + /// Returns an error if any client disconnection failed, otherwise success. + llvm::Error WaitForAllSessionsToDisconnect(); + + /// Set the shared debugger instance for a unique target ID. + void SetSharedDebugger(uint32_t target_id, lldb::SBDebugger debugger); + + /// Get the shared debugger instance for a unique target ID. + std::optional<lldb::SBDebugger> GetSharedDebugger(uint32_t target_id); + + /// Get or create event thread for a specific debugger. + std::shared_ptr<ManagedEventThread> + GetEventThreadForDebugger(lldb::SBDebugger debugger, DAP *requesting_dap); + + /// Find the DAP instance that owns the given target. + DAP *FindDAPForTarget(lldb::SBTarget target); + + /// Static convenience method for FindDAPForTarget. + static DAP *FindDAP(lldb::SBTarget target) { + return GetInstance().FindDAPForTarget(target); + } + + /// Clean up shared resources when the last session exits. + void CleanupSharedResources(); + + /// Clean up expired event threads from the collection. + void ReleaseExpiredEventThreads(); + +private: + DAPSessionManager() = default; + ~DAPSessionManager() = default; + + // Non-copyable and non-movable. + DAPSessionManager(const DAPSessionManager &) = delete; + DAPSessionManager &operator=(const DAPSessionManager &) = delete; + DAPSessionManager(DAPSessionManager &&) = delete; + DAPSessionManager &operator=(DAPSessionManager &&) = delete; + + bool m_client_failed = false; + std::mutex m_sessions_mutex; + std::condition_variable m_sessions_condition; + std::map<lldb_private::MainLoop *, DAP *> m_active_sessions; + + /// Optional map from target ID to shared debugger set when the native + /// process creates a new target. + std::map<uint32_t, lldb::SBDebugger> m_target_to_debugger_map; + + /// Map from debugger ID to its event thread used for when + /// multiple DAP sessions are using the same debugger instance. + std::map<lldb::user_id_t, std::weak_ptr<ManagedEventThread>> ---------------- qxy11 wrote:
The DAPSessionManager/DAP works w/ the SB API, but to use `Debugger*` as the key, that'd require accessing the private internal API via `SBDebugger::get()` - would we want to make this a friend class to expose that to it? https://github.com/llvm/llvm-project/pull/163653 _______________________________________________ lldb-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
