[llvm] Add regression test for libcxx copy_file infinite loop issue (#169261) (PR #169288)
Tamalampudi Siva Harsha Vardhan Reddy via llvm-commits
llvm-commits at lists.llvm.org
Sun Nov 23 23:33:45 PST 2025
https://github.com/harsha08-2k6 created https://github.com/llvm/llvm-project/pull/169288
This test case demonstrates the infinite loop condition reported in Issue #169261.
Problem: When copy_file is called concurrently from multiple threads without proper locking, the operation can get stuck in an infinite loop in copy_file_impl_copy_file_range when the count variable becomes 0, causing the while (count > 0) loop to never exit.
Test Details:
- Creates multiple threads that attempt to copy files concurrently
- Each thread tries to copy the same source file to a different destination
- The test verifies all threads complete successfully without hanging
- Includes proper cleanup of test files and directories
This regression test ensures the multithreaded safety of the fs::copy_file operation.
>From 95c0ce8d636431f4688fead751068d0c2922e58a Mon Sep 17 00:00:00 2001
From: Tamalampudi Siva Harsha Vardhan Reddy <2400030361 at kluniversity.in>
Date: Mon, 24 Nov 2025 13:02:32 +0530
Subject: [PATCH] Add regression test for libcxx copy_file infinite loop issue
(#169261)
This test case demonstrates the infinite loop condition reported in Issue #169261.
Problem: When copy_file is called concurrently from multiple threads without proper locking,
the operation can get stuck in an infinite loop in copy_file_impl_copy_file_range when the
count variable becomes 0, causing the while (count > 0) loop to never exit.
Test Details:
- Creates multiple threads that attempt to copy files concurrently
- Each thread tries to copy the same source file to a different destination
- The test verifies all threads complete successfully without hanging
- Includes proper cleanup of test files and directories
This regression test ensures the multithreaded safety of the fs::copy_file operation.
---
test_copy_file_multithreaded.cpp | 86 ++++++++++++++++++++++++++++++++
1 file changed, 86 insertions(+)
create mode 100644 test_copy_file_multithreaded.cpp
diff --git a/test_copy_file_multithreaded.cpp b/test_copy_file_multithreaded.cpp
new file mode 100644
index 0000000000000..99b7f66c0f46c
--- /dev/null
+++ b/test_copy_file_multithreaded.cpp
@@ -0,0 +1,86 @@
+// Test case for Issue #169261: [libcxx] copy_file enters an infinite loop in a multithreaded environment
+// This test demonstrates the infinite loop bug in copy_file when called concurrently from multiple threads
+// when using copy_file_impl_copy_file_range (the count gets stuck at 0, causing an infinite loop)
+
+#include <filesystem>
+#include <thread>
+#include <vector>
+#include <fstream>
+#include <iostream>
+#include <chrono>
+#include <atomic>
+
+namespace fs = std::filesystem;
+
+// This test creates multiple threads that attempt to copy the same file concurrently
+// to different destinations to trigger the infinite loop condition
+void test_copy_file_multithreaded() {
+ // Create a test source file
+ fs::path src_file = "test_source.txt";
+ fs::path dest_dir = "test_dests";
+
+ // Cleanup from previous runs
+ fs::remove_all(dest_dir);
+ fs::create_directories(dest_dir);
+
+ // Create source file with some content
+ {
+ std::ofstream out(src_file);
+ out << "Test content for copy operation in multithreaded environment\n";
+ out << "This file tests the infinite loop issue reported in Issue #169261\n";
+ for (int i = 0; i < 100; ++i) {
+ out << "Line " << i << ": Lorem ipsum dolor sit amet\n";
+ }
+ }
+
+ // Test: Create multiple threads that copy the file concurrently
+ std::vector<std::thread> threads;
+ std::atomic<int> success_count(0);
+ std::atomic<int> error_count(0);
+
+ auto copy_worker = [&](int thread_id) {
+ try {
+ fs::path dest = dest_dir / ("copy_" + std::to_string(thread_id) + ".txt");
+ // Add timeout mechanism to detect infinite loop (hang would indicate bug)
+ std::cout << "Thread " << thread_id << ": Starting copy operation\n";
+ fs::copy_file(src_file, dest);
+ std::cout << "Thread " << thread_id << ": Copy completed successfully\n";
+ success_count++;
+ } catch (const std::exception& e) {
+ std::cout << "Thread " << thread_id << ": Error - " << e.what() << "\n";
+ error_count++;
+ }
+ };
+
+ // Spawn multiple threads
+ for (int i = 0; i < 4; ++i) {
+ threads.emplace_back(copy_worker, i);
+ }
+
+ // Wait for all threads with timeout
+ for (auto& thread : threads) {
+ thread.join();
+ }
+
+ std::cout << "Test completed: Success=" << success_count << " Errors=" << error_count << "\n";
+
+ // Verify all files were created
+ int created_files = 0;
+ for (const auto& entry : fs::directory_iterator(dest_dir)) {
+ if (entry.is_regular_file()) {
+ created_files++;
+ }
+ }
+ std::cout << "Files created in destination: " << created_files << "\n";
+
+ // Cleanup
+ fs::remove(src_file);
+ fs::remove_all(dest_dir);
+}
+
+int main() {
+ std::cout << "Testing copy_file in multithreaded environment (Issue #169261)\n";
+ test_copy_file_multithreaded();
+ std::cout << "Test finished\n";
+ return 0;
+}
More information about the llvm-commits
mailing list