| //===----------------------------------------------------------------------===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| // UNSUPPORTED: c++11, c++14 |
| // UNSUPPORTED: no-threads |
| |
| // UNSUPPORTED: !libcpp-has-debug-mode, c++03 |
| |
| // test multithreaded container debugging |
| |
| #include <cassert> |
| #include <cstddef> |
| #include <deque> |
| #include <list> |
| #include <thread> |
| #include <vector> |
| |
| template <typename Container> |
| Container makeContainer(int size) { |
| Container c; |
| typedef typename Container::value_type ValueType; |
| for (int i = 0; i < size; ++i) |
| c.insert(c.end(), ValueType(i)); |
| assert(c.size() == static_cast<std::size_t>(size)); |
| return c; |
| } |
| |
| template <typename Container> |
| void ThreadUseIter() { |
| const std::size_t maxRounds = 7; |
| struct TestRunner{ |
| void operator()() { |
| for (std::size_t count = 0; count < maxRounds; count++) { |
| const std::size_t containerCount = 11; |
| std::vector<Container> containers; |
| std::vector<typename Container::iterator> iterators; |
| for (std::size_t containerIndex = 0; containerIndex < containerCount; containerIndex++) { |
| containers.push_back(makeContainer<Container>(3)); |
| Container& c = containers.back(); |
| iterators.push_back(c.begin()); |
| iterators.push_back(c.end()); |
| } |
| } |
| } |
| }; |
| |
| TestRunner r; |
| const std::size_t threadCount = 4; |
| std::vector<std::thread> threads; |
| for (std::size_t count = 0; count < threadCount; count++) |
| threads.emplace_back(r); |
| r(); |
| for (std::size_t count = 0; count < threadCount; count++) |
| threads[count].join(); |
| } |
| |
| int main(int, char**) { |
| ThreadUseIter<std::vector<int> >(); |
| return 0; |
| } |