[llvm] [llvm-exegesis] Add thread IDs to subprocess memory names (PR #84451)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Mar 8 02:04:58 PST 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-tools-llvm-exegesis
Author: Aiden Grossman (boomanaiden154)
<details>
<summary>Changes</summary>
This patch adds the thread ID to the subprocess memory shared memory names. This avoids conflicts for downstream consumers that might want to consume llvm-exegesis across multiple threads, which would otherwise run into conflicts due to the same PID running multiple instances.
---
Full diff: https://github.com/llvm/llvm-project/pull/84451.diff
2 Files Affected:
- (modified) llvm/tools/llvm-exegesis/lib/SubprocessMemory.cpp (+14-3)
- (modified) llvm/unittests/tools/llvm-exegesis/X86/SubprocessMemoryTest.cpp (+4-1)
``````````diff
diff --git a/llvm/tools/llvm-exegesis/lib/SubprocessMemory.cpp b/llvm/tools/llvm-exegesis/lib/SubprocessMemory.cpp
index a49fa077257d00..28dc4488a2a004 100644
--- a/llvm/tools/llvm-exegesis/lib/SubprocessMemory.cpp
+++ b/llvm/tools/llvm-exegesis/lib/SubprocessMemory.cpp
@@ -14,6 +14,7 @@
#ifdef __linux__
#include <fcntl.h>
#include <sys/mman.h>
+#include <sys/syscall.h>
#include <unistd.h>
#endif
@@ -22,12 +23,21 @@ namespace exegesis {
#if defined(__linux__) && !defined(__ANDROID__)
+long getCurrentTID() {
+ // We're using the raw syscall here rather than the gettid() function provided
+ // by most libcs for compatibility as gettid() was only added to glibc in
+ // version 2.30.
+ return syscall(SYS_gettid);
+}
+
Error SubprocessMemory::initializeSubprocessMemory(pid_t ProcessID) {
// Add the PID to the shared memory name so that if we're running multiple
// processes at the same time, they won't interfere with each other.
// This comes up particularly often when running the exegesis tests with
- // llvm-lit
- std::string AuxiliaryMemoryName = "/auxmem" + std::to_string(ProcessID);
+ // llvm-lit. Additionally add the TID so that downstream consumers
+ // using multiple threads don't run into conflicts.
+ std::string AuxiliaryMemoryName = "/" + std::to_string(getCurrentTID()) +
+ "auxmem" + std::to_string(ProcessID);
int AuxiliaryMemoryFD = shm_open(AuxiliaryMemoryName.c_str(),
O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
if (AuxiliaryMemoryFD == -1)
@@ -47,7 +57,8 @@ Error SubprocessMemory::addMemoryDefinition(
pid_t ProcessPID) {
SharedMemoryNames.reserve(MemoryDefinitions.size());
for (auto &[Name, MemVal] : MemoryDefinitions) {
- std::string SharedMemoryName = "/" + std::to_string(ProcessPID) + "memdef" +
+ std::string SharedMemoryName = "/" + std::to_string(ProcessPID) + "t" +
+ std::to_string(getCurrentTID()) + "memdef" +
std::to_string(MemVal.Index);
SharedMemoryNames.push_back(SharedMemoryName);
int SharedMemoryFD =
diff --git a/llvm/unittests/tools/llvm-exegesis/X86/SubprocessMemoryTest.cpp b/llvm/unittests/tools/llvm-exegesis/X86/SubprocessMemoryTest.cpp
index c07ec188a602c4..7c23e7b7e9c5a5 100644
--- a/llvm/unittests/tools/llvm-exegesis/X86/SubprocessMemoryTest.cpp
+++ b/llvm/unittests/tools/llvm-exegesis/X86/SubprocessMemoryTest.cpp
@@ -17,6 +17,7 @@
#include <endian.h>
#include <fcntl.h>
#include <sys/mman.h>
+#include <sys/syscall.h>
#include <unistd.h>
#endif // __linux__
@@ -49,7 +50,9 @@ class SubprocessMemoryTest : public X86TestBase {
std::string getSharedMemoryName(const unsigned TestNumber,
const unsigned DefinitionNumber) {
- return "/" + std::to_string(getSharedMemoryNumber(TestNumber)) + "memdef" +
+ long CurrentTID = syscall(SYS_gettid);
+ return "/" + std::to_string(getSharedMemoryNumber(TestNumber)) + "t" +
+ std::to_string(CurrentTID) + "memdef" +
std::to_string(DefinitionNumber);
}
``````````
</details>
https://github.com/llvm/llvm-project/pull/84451
More information about the llvm-commits
mailing list