[Lldb-commits] [lldb] [lldb-dap] Refactoring lldb-dap port listening mode to allow multiple connections. (PR #116392)
Pavel Labath via lldb-commits
lldb-commits at lists.llvm.org
Mon Nov 25 00:34:10 PST 2024
================
@@ -1196,6 +1202,62 @@ def terminate(self):
self.process.wait()
self.process = None
+ @classmethod
+ def launch(
+ cls, executable: str, /, connection=None, log_file=None, env=None
+ ) -> tuple[subprocess.Popen, str]:
+ adaptor_env = os.environ.copy()
+ if env:
+ adaptor_env.update(env)
+
+ if log_file:
+ adaptor_env["LLDBDAP_LOG"] = log_file
+
+ if os.uname().sysname == "Darwin":
+ adaptor_env["NSUnbufferedIO"] = "YES"
+
+ args = [executable]
+ if connection:
+ args.append("--connection")
+ args.append(connection)
+
+ proc = subprocess.Popen(
+ args,
+ stdin=subprocess.PIPE,
+ stdout=subprocess.PIPE,
+ stderr=sys.stdout,
+ env=adaptor_env,
+ )
+
+ if connection:
+ # If a conneciton is specified, lldb-dap will print the listening
+ # address once the listener is made to stdout. The listener is
+ # formatted like `tcp://host:port` or `unix:///path`.
+ with selectors.DefaultSelector() as sel:
+ print("Reading stdout for the listening connection")
+ os.set_blocking(proc.stdout.fileno(), False)
+ stdout_key = sel.register(proc.stdout, selectors.EVENT_READ)
+ rdy_fds = sel.select(timeout=10.0)
----------------
labath wrote:
It looks like this will be a problem for windows (which can only `select` sockets). I can think of a couple of alternatives (writing the connection spec to a file -- and polling for it; using OS apis directly -- we have a `Pipe` class in `lldbgdbserverutils.py` for the lldb-server use case; doing a blocking read and relying on the test suite level timeout; ...), but neither of them is clearly superior.
https://github.com/llvm/llvm-project/pull/116392
More information about the lldb-commits
mailing list