//===-- RunInTerminal.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_VSCODE_RUNINTERMINAL_H #define LLDB_TOOLS_LLDB_VSCODE_RUNINTERMINAL_H #include "FifoFiles.h" #include #include namespace lldb_vscode { enum RunInTerminalMessageKind { eRunInTerminalMessageKindPID = 0, eRunInTerminalMessageKindError, eRunInTerminalMessageKindDidAttach, }; struct RunInTerminalMessage; struct RunInTerminalMessagePid; struct RunInTerminalMessageError; struct RunInTerminalMessageDidAttach; struct RunInTerminalMessage { RunInTerminalMessage(RunInTerminalMessageKind kind); virtual ~RunInTerminalMessage() = default; /// Serialize this object to JSON virtual llvm::json::Value ToJSON() const = 0; const RunInTerminalMessagePid *GetAsPidMessage() const; const RunInTerminalMessageError *GetAsErrorMessage() const; RunInTerminalMessageKind kind; }; using RunInTerminalMessageUP = std::unique_ptr; struct RunInTerminalMessagePid : RunInTerminalMessage { RunInTerminalMessagePid(lldb::pid_t pid); llvm::json::Value ToJSON() const override; lldb::pid_t pid; }; struct RunInTerminalMessageError : RunInTerminalMessage { RunInTerminalMessageError(llvm::StringRef error); llvm::json::Value ToJSON() const override; std::string error; }; struct RunInTerminalMessageDidAttach : RunInTerminalMessage { RunInTerminalMessageDidAttach(); llvm::json::Value ToJSON() const override; }; class RunInTerminalLauncherCommChannel { public: RunInTerminalLauncherCommChannel(llvm::StringRef comm_file); /// Wait until the debug adaptor attaches. /// /// \param[in] timeout /// How long to wait to be attached. // /// \return /// An \a llvm::Error object in case of errors or if this operation times /// out. llvm::Error WaitUntilDebugAdaptorAttaches(std::chrono::milliseconds timeout); /// Notify the debug adaptor this process' pid. /// /// \return /// An \a llvm::Error object in case of errors or if this operation times /// out. llvm::Error NotifyPid(); /// Notify the debug adaptor that there's been an error. void NotifyError(llvm::StringRef error); private: FifoFileIO m_io; }; class RunInTerminalDebugAdapterCommChannel { public: RunInTerminalDebugAdapterCommChannel(llvm::StringRef comm_file); /// Notify the runInTerminal launcher that it was attached. /// /// \return /// A future indicated whether the runInTerminal launcher received the /// message correctly or not. std::future NotifyDidAttach(); /// Fetch the pid of the runInTerminal launcher. /// /// \return /// An \a llvm::Error object in case of errors or if this operation times /// out. llvm::Expected GetLauncherPid(); /// Fetch any errors emitted by the runInTerminal launcher or return a /// default error message if a certain timeout if reached. std::string GetLauncherError(); private: FifoFileIO m_io; }; /// Create a fifo file used to communicate the debug adaptor with /// the runInTerminal launcher. llvm::Expected> CreateRunInTerminalCommFile(); } // namespace lldb_vscode #endif // LLDB_TOOLS_LLDB_VSCODE_RUNINTERMINAL_H