[libcxx-commits] [libcxx] r358591 - [libc++] Add a test that uses the debug database from multiple threads
Louis Dionne via libcxx-commits
libcxx-commits at lists.llvm.org
Wed Apr 17 09:21:55 PDT 2019
Author: ldionne
Date: Wed Apr 17 09:21:55 2019
New Revision: 358591
URL: http://llvm.org/viewvc/llvm-project?rev=358591&view=rev
Log:
[libc++] Add a test that uses the debug database from multiple threads
This test helped us concurrently discover the problem that was fixed
in r355367.
Modified:
libcxx/trunk/test/libcxx/debug/containers/db_sequence_container_iterators.pass.cpp
Modified: libcxx/trunk/test/libcxx/debug/containers/db_sequence_container_iterators.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/libcxx/debug/containers/db_sequence_container_iterators.pass.cpp?rev=358591&r1=358590&r2=358591&view=diff
==============================================================================
--- libcxx/trunk/test/libcxx/debug/containers/db_sequence_container_iterators.pass.cpp (original)
+++ libcxx/trunk/test/libcxx/debug/containers/db_sequence_container_iterators.pass.cpp Wed Apr 17 09:21:55 2019
@@ -22,6 +22,9 @@
#include <list>
#include <vector>
#include <deque>
+#if !defined(_LIBCPP_HAS_NO_THREADS)
+# include <thread>
+#endif
#include "container_debug_tests.hpp"
#include "debug_mode_helper.h"
@@ -51,6 +54,7 @@ public:
InsertIterIterIter();
EmplaceIterValue();
EraseIterIter();
+ ThreadUseIter();
}
else {
SpliceFirstElemAfter();
@@ -185,6 +189,36 @@ private:
EXPECT_DEATH( CC.front() );
}
+ static void ThreadUseIter() {
+#if !defined(_LIBCPP_HAS_NO_THREADS)
+ CHECKPOINT("thread iter use");
+ const size_t maxRounds = 7;
+ struct TestRunner{
+ void operator()() {
+ for (size_t count = 0; count < maxRounds; count++) {
+ const size_t containerCount = 21;
+ std::vector<Container> containers;
+ std::vector<typename Container::iterator> iterators;
+ for (size_t containerIndex = 0; containerIndex < containerCount; containerIndex++) {
+ containers.push_back(makeContainer(3));
+ Container &c = containers.back();
+ iterators.push_back(c.begin());
+ iterators.push_back(c.end());
+ }
+ }
+ }
+ };
+ TestRunner r;
+ const size_t threadCount = 13;
+ std::vector<std::thread> threads;
+ for (size_t count = 0; count < threadCount; count++)
+ threads.emplace_back(r);
+ r();
+ for (size_t count = 0; count < threadCount; count++)
+ threads[count].join();
+#endif
+ }
+
static void EraseIterIter() {
CHECKPOINT("testing erase iter iter invalidation");
Container C1 = makeContainer(3);
More information about the libcxx-commits
mailing list