From 00f2ab1c2f014ffc790c59fc0e9fa1bc8647cba2 Mon Sep 17 00:00:00 2001 From: Louis Dionne Date: Wed, 17 Apr 2019 16:21:55 +0000 Subject: [PATCH] [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. llvm-svn: 358591 --- .../db_sequence_container_iterators.pass.cpp | 34 ++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/libcxx/test/libcxx/debug/containers/db_sequence_container_iterators.pass.cpp b/libcxx/test/libcxx/debug/containers/db_sequence_container_iterators.pass.cpp index e3932bc..3014ae3 100644 --- a/libcxx/test/libcxx/debug/containers/db_sequence_container_iterators.pass.cpp +++ b/libcxx/test/libcxx/debug/containers/db_sequence_container_iterators.pass.cpp @@ -22,6 +22,9 @@ #include #include #include +#if !defined(_LIBCPP_HAS_NO_THREADS) +# include +#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 containers; + std::vector 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 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); -- 2.7.4