207
|
1 //===-- RunInTerminal.h ----------------------------------------*- C++ -*-===//
|
|
2 //
|
|
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
4 // See https://llvm.org/LICENSE.txt for license information.
|
|
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
6 //
|
|
7 //===----------------------------------------------------------------------===//
|
|
8
|
|
9 #ifndef LLDB_TOOLS_LLDB_VSCODE_RUNINTERMINAL_H
|
|
10 #define LLDB_TOOLS_LLDB_VSCODE_RUNINTERMINAL_H
|
|
11
|
|
12 #include "FifoFiles.h"
|
|
13
|
|
14 #include <future>
|
|
15 #include <thread>
|
|
16
|
|
17 namespace lldb_vscode {
|
|
18
|
|
19 enum RunInTerminalMessageKind {
|
|
20 eRunInTerminalMessageKindPID = 0,
|
|
21 eRunInTerminalMessageKindError,
|
|
22 eRunInTerminalMessageKindDidAttach,
|
|
23 };
|
|
24
|
|
25 struct RunInTerminalMessage;
|
|
26 struct RunInTerminalMessagePid;
|
|
27 struct RunInTerminalMessageError;
|
|
28 struct RunInTerminalMessageDidAttach;
|
|
29
|
|
30 struct RunInTerminalMessage {
|
|
31 RunInTerminalMessage(RunInTerminalMessageKind kind);
|
|
32
|
|
33 virtual ~RunInTerminalMessage() = default;
|
|
34
|
|
35 /// Serialize this object to JSON
|
|
36 virtual llvm::json::Value ToJSON() const = 0;
|
|
37
|
|
38 const RunInTerminalMessagePid *GetAsPidMessage() const;
|
|
39
|
|
40 const RunInTerminalMessageError *GetAsErrorMessage() const;
|
|
41
|
|
42 RunInTerminalMessageKind kind;
|
|
43 };
|
|
44
|
|
45 using RunInTerminalMessageUP = std::unique_ptr<RunInTerminalMessage>;
|
|
46
|
|
47 struct RunInTerminalMessagePid : RunInTerminalMessage {
|
|
48 RunInTerminalMessagePid(lldb::pid_t pid);
|
|
49
|
|
50 llvm::json::Value ToJSON() const override;
|
|
51
|
|
52 lldb::pid_t pid;
|
|
53 };
|
|
54
|
|
55 struct RunInTerminalMessageError : RunInTerminalMessage {
|
|
56 RunInTerminalMessageError(llvm::StringRef error);
|
|
57
|
|
58 llvm::json::Value ToJSON() const override;
|
|
59
|
|
60 std::string error;
|
|
61 };
|
|
62
|
|
63 struct RunInTerminalMessageDidAttach : RunInTerminalMessage {
|
|
64 RunInTerminalMessageDidAttach();
|
|
65
|
|
66 llvm::json::Value ToJSON() const override;
|
|
67 };
|
|
68
|
|
69 class RunInTerminalLauncherCommChannel {
|
|
70 public:
|
|
71 RunInTerminalLauncherCommChannel(llvm::StringRef comm_file);
|
|
72
|
|
73 /// Wait until the debug adaptor attaches.
|
|
74 ///
|
|
75 /// \param[in] timeout
|
|
76 /// How long to wait to be attached.
|
|
77 //
|
|
78 /// \return
|
|
79 /// An \a llvm::Error object in case of errors or if this operation times
|
|
80 /// out.
|
|
81 llvm::Error WaitUntilDebugAdaptorAttaches(std::chrono::milliseconds timeout);
|
|
82
|
|
83 /// Notify the debug adaptor this process' pid.
|
|
84 ///
|
|
85 /// \return
|
|
86 /// An \a llvm::Error object in case of errors or if this operation times
|
|
87 /// out.
|
|
88 llvm::Error NotifyPid();
|
|
89
|
|
90 /// Notify the debug adaptor that there's been an error.
|
|
91 void NotifyError(llvm::StringRef error);
|
|
92
|
|
93 private:
|
|
94 FifoFileIO m_io;
|
|
95 };
|
|
96
|
|
97 class RunInTerminalDebugAdapterCommChannel {
|
|
98 public:
|
|
99 RunInTerminalDebugAdapterCommChannel(llvm::StringRef comm_file);
|
|
100
|
|
101 /// Notify the runInTerminal launcher that it was attached.
|
|
102 ///
|
|
103 /// \return
|
|
104 /// A future indicated whether the runInTerminal launcher received the
|
|
105 /// message correctly or not.
|
|
106 std::future<lldb::SBError> NotifyDidAttach();
|
|
107
|
|
108 /// Fetch the pid of the runInTerminal launcher.
|
|
109 ///
|
|
110 /// \return
|
|
111 /// An \a llvm::Error object in case of errors or if this operation times
|
|
112 /// out.
|
|
113 llvm::Expected<lldb::pid_t> GetLauncherPid();
|
|
114
|
|
115 /// Fetch any errors emitted by the runInTerminal launcher or return a
|
|
116 /// default error message if a certain timeout if reached.
|
|
117 std::string GetLauncherError();
|
|
118
|
|
119 private:
|
|
120 FifoFileIO m_io;
|
|
121 };
|
|
122
|
|
123 /// Create a fifo file used to communicate the debug adaptor with
|
|
124 /// the runInTerminal launcher.
|
|
125 llvm::Expected<std::shared_ptr<FifoFile>> CreateRunInTerminalCommFile();
|
|
126
|
|
127 } // namespace lldb_vscode
|
|
128
|
|
129 #endif // LLDB_TOOLS_LLDB_VSCODE_RUNINTERMINAL_H
|