[llvm] [ThreadPool] Fix Windows failures in the AffinityMask unit test (PR #155614)
Andrew Ng via llvm-commits
llvm-commits at lists.llvm.org
Wed Aug 27 05:58:37 PDT 2025
https://github.com/nga888 created https://github.com/llvm/llvm-project/pull/155614
These thread pool tests are typed and one was failing due to the setting of environment variable `LLVM_THREADPOOL_AFFINITYMASK` leaking out of a previous run of the test. I suspect that this has mainly succeeded because the tests have run in separate shards.
Also the re-invocation of the unit test with the process affinity mask set was not actually running the test because `--gtest_filter=` was not set correctly. This has been fixed.
The use of the test type (TypeParam) in the AsyncBarrier test has been restored. Without this the typing of these tests would be completely redundant.
I suspect that some of these unit tests do not work if `LLVM_ENABLE_THREADS == 0` but that is beyond the scope of this fix.
>From 67b8281085ddbeedc073b69ef85024d7d7e756ca Mon Sep 17 00:00:00 2001
From: Andrew Ng <andrew.ng at sony.com>
Date: Wed, 27 Aug 2025 10:29:52 +0100
Subject: [PATCH] [ThreadPool] Fix Windows failures in the AffinityMask unit
test
These thread pool tests are typed and one was failing due to the setting
of environment variable `LLVM_THREADPOOL_AFFINITYMASK` leaking out of a
previous run of the test. I suspect that this has mainly succeeded
because the tests have run in separate shards.
Also the re-invocation of the unit test with the process affinity mask
set was not actually running the test because `--gtest_filter=` was not
set correctly. This has been fixed.
The use of the test type (TypeParam) in the AsyncBarrier test has been
restored. Without this the typing of these tests would be completely
redundant.
I suspect that some of these unit tests do not work if
`LLVM_ENABLE_THREADS == 0` but that is beyond the scope of this fix.
---
llvm/unittests/Support/ThreadPool.cpp | 14 ++++++++++----
1 file changed, 10 insertions(+), 4 deletions(-)
diff --git a/llvm/unittests/Support/ThreadPool.cpp b/llvm/unittests/Support/ThreadPool.cpp
index 8dca182882ef3..aa7f8744e1417 100644
--- a/llvm/unittests/Support/ThreadPool.cpp
+++ b/llvm/unittests/Support/ThreadPool.cpp
@@ -140,7 +140,7 @@ TYPED_TEST(ThreadPoolTest, AsyncBarrier) {
std::atomic_int checked_in{0};
- DefaultThreadPool Pool;
+ TypeParam Pool;
for (size_t i = 0; i < 5; ++i) {
Pool.async([this, &checked_in] {
this->waitForMainThread();
@@ -453,15 +453,19 @@ TYPED_TEST(ThreadPoolTest, AffinityMask) {
[](auto &T) { return T.getData().front() < 16UL; }) &&
"Threads ran on more CPUs than expected! The affinity mask does not "
"seem to work.");
- GTEST_SKIP();
+ return;
}
std::string Executable =
sys::fs::getMainExecutable(TestMainArgv0, &ThreadPoolTestStringArg1);
- StringRef argv[] = {Executable, "--gtest_filter=ThreadPoolTest.AffinityMask"};
+ const auto *TestInfo = testing::UnitTest::GetInstance()->current_test_info();
+ std::string Arg = (Twine("--gtest_filter=") + TestInfo->test_suite_name() +
+ "." + TestInfo->name())
+ .str();
+ StringRef argv[] = {Executable, Arg};
// Add environment variable to the environment of the child process.
int Res = setenv("LLVM_THREADPOOL_AFFINITYMASK", "1", false);
- ASSERT_EQ(Res, 0);
+ ASSERT_EQ(0, Res);
std::string Error;
bool ExecutionFailed;
@@ -470,6 +474,8 @@ TYPED_TEST(ThreadPoolTest, AffinityMask) {
Affinity.set(0, 4); // Use CPUs 0,1,2,3.
int Ret = sys::ExecuteAndWait(Executable, argv, {}, {}, 0, 0, &Error,
&ExecutionFailed, nullptr, &Affinity);
+ Res = setenv("LLVM_THREADPOOL_AFFINITYMASK", "", false);
+ ASSERT_EQ(0, Res);
ASSERT_EQ(0, Ret);
}
More information about the llvm-commits
mailing list