[Lldb-commits] [lldb] [lldb/windows] Make "anonymous" pipe names more unique (PR #123905)
Pavel Labath via lldb-commits
lldb-commits at lists.llvm.org
Wed Jan 22 00:29:19 PST 2025
https://github.com/labath created https://github.com/llvm/llvm-project/pull/123905
Using a "random" name for an "anonymous" pipe seems to be the state of the art on windows (according to stack overflow, new windows versions may have something better, but it involves calling kernel APIs directly and generally a lot of dark magic).
The problem with the current method was that is does not produce unique names if one has two copies of the pipe code in the same process, which is what happened with #120457 (because liblldb only exposes the public api, and we've started using the pipe code in lldb-dap as well).
This patch works around the problem by adding the address of the counter variable to the pipe name.
Replicating the multiple-copies setup in a test would be very difficult, which is why I'm not adding a test for this scenario.
>From 1903ad0981927797326bea72467c87a43eef4702 Mon Sep 17 00:00:00 2001
From: Pavel Labath <pavel at labath.sk>
Date: Tue, 21 Jan 2025 18:53:17 +0100
Subject: [PATCH] [lldb/windows] Make "anonymous" pipe names more unique
Using a "random" name for an "anonymous" pipe seems to be the state of
the art on windows (according to stack overflow, new windows versions
may have something better, but it involves calling kernel APIs directly
and generally a lot of dark magic).
The problem with the current method was that is does not produce unique
names if one has two copies of the pipe code in the same process, which
is what happened with #120457 (because liblldb only exposes the public
api, and we've started using the pipe code in lldb-dap as well).
This patch works around the problem by adding the address of the counter
variable to the pipe name.
Replicating the multiple-copies setup in a test would be very difficult,
which is why I'm not adding a test for this scenario.
---
lldb/source/Host/windows/PipeWindows.cpp | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/lldb/source/Host/windows/PipeWindows.cpp b/lldb/source/Host/windows/PipeWindows.cpp
index 21e30f0ae87384..e95007ae8fd163 100644
--- a/lldb/source/Host/windows/PipeWindows.cpp
+++ b/lldb/source/Host/windows/PipeWindows.cpp
@@ -71,9 +71,8 @@ Status PipeWindows::CreateNew(bool child_process_inherit) {
// cannot get overlapped i/o on Windows without using a named pipe. So we
// synthesize a unique name.
uint32_t serial = g_pipe_serial.fetch_add(1);
- std::string pipe_name;
- llvm::raw_string_ostream pipe_name_stream(pipe_name);
- pipe_name_stream << "lldb.pipe." << ::GetCurrentProcessId() << "." << serial;
+ std::string pipe_name = llvm::formatv(
+ "lldb.pipe.{0}.{1}.{2}", GetCurrentProcessId(), &g_pipe_serial, serial);
return CreateNew(pipe_name.c_str(), child_process_inherit);
}
More information about the lldb-commits
mailing list