From 09ef420d6254f945a50da07a0a71c2c7a93b6b12 Mon Sep 17 00:00:00 2001 From: Louis Dionne Date: Wed, 17 Apr 2019 20:07:39 +0000 Subject: [PATCH] [libc++] (Take 2) Add a test that uses the debug database from multiple threads In r358591, I added a test that uses the debug database from multiple threads and that helped us uncover the problem that was fixed in r355367. However, the test broke the tsan CI bots, and I think the problem is the test allocator that was used in the test (which is not thread safe). I'm committing again without using the test allocator, and in a separate test file. llvm-svn: 358610 --- ...quence_container_iterators.multithread.pass.cpp | 72 ++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 libcxx/test/libcxx/debug/containers/db_sequence_container_iterators.multithread.pass.cpp diff --git a/libcxx/test/libcxx/debug/containers/db_sequence_container_iterators.multithread.pass.cpp b/libcxx/test/libcxx/debug/containers/db_sequence_container_iterators.multithread.pass.cpp new file mode 100644 index 0000000..3cd0ce0 --- /dev/null +++ b/libcxx/test/libcxx/debug/containers/db_sequence_container_iterators.multithread.pass.cpp @@ -0,0 +1,72 @@ +//===----------------------------------------------------------------------===// +// +// 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++98, c++03, c++11, c++14 +// UNSUPPORTED: windows +// UNSUPPORTED: libcpp-has-no-threads +// MODULES_DEFINES: _LIBCPP_DEBUG=1 + +// Can't test the system lib because this test enables debug mode +// UNSUPPORTED: with_system_cxx_lib + +// test multihtreaded container debugging + +#define _LIBCPP_DEBUG 1 + +#include +#include +#include +#include +#include +#include +#include "container_debug_tests.hpp" + + +template +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(size)); + return c; +} + +template +void ThreadUseIter() { + const size_t maxRounds = 7; + struct TestRunner{ + void operator()() { + for (size_t count = 0; count < maxRounds; count++) { + const size_t containerCount = 11; + 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 = 4; + 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(); +} + +int main(int, char**) { + ThreadUseIter >(); + return 0; +} -- 2.7.4