File: RunInTerminal.h

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (129 lines) | stat: -rw-r--r-- 3,544 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
//===-- 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_DAP_RUNINTERMINAL_H
#define LLDB_TOOLS_LLDB_DAP_RUNINTERMINAL_H

#include "FifoFiles.h"

#include <future>
#include <thread>

namespace lldb_dap {

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<RunInTerminalMessage>;

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<lldb::SBError> 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<lldb::pid_t> 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<std::shared_ptr<FifoFile>> CreateRunInTerminalCommFile();

} // namespace lldb_dap

#endif // LLDB_TOOLS_LLDB_DAP_RUNINTERMINAL_H