| #include "lldb/DataFormatters/TypeSummary.h" |
| #include "lldb/Target/Statistics.h" |
| #include "lldb/Utility/Stream.h" |
| #include "lldb/lldb-forward.h" |
| #include "lldb/lldb-private-enumerations.h" |
| #include "lldb/lldb-private.h" |
| #include "llvm/Testing/Support/Error.h" |
| #include "gtest/gtest.h" |
| #include <thread> |
| |
| using namespace lldb_private; |
| using Duration = std::chrono::duration<double>; |
| |
| class DummySummaryImpl : public lldb_private::TypeSummaryImpl { |
| public: |
| DummySummaryImpl() |
| : TypeSummaryImpl(TypeSummaryImpl::Kind::eSummaryString, |
| TypeSummaryImpl::Flags()) {} |
| |
| std::string GetName() override { return "DummySummary"; } |
| |
| std::string GetSummaryKindName() override { return "dummy"; } |
| |
| std::string GetDescription() override { return ""; } |
| |
| bool FormatObject(ValueObject *valobj, std::string &dest, |
| const TypeSummaryOptions &options) override { |
| return false; |
| } |
| }; |
| |
| TEST(MultithreadFormatting, Multithread) { |
| SummaryStatisticsCache statistics_cache; |
| DummySummaryImpl summary; |
| std::vector<std::thread> threads; |
| for (int i = 0; i < 10; ++i) { |
| threads.emplace_back(std::thread([&statistics_cache, &summary]() { |
| auto sp = statistics_cache.GetSummaryStatisticsForProvider(summary); |
| { |
| SummaryStatistics::SummaryInvocation invocation(sp); |
| std::this_thread::sleep_for(Duration(1)); |
| } |
| })); |
| } |
| |
| for (auto &thread : threads) |
| thread.join(); |
| |
| auto sp = statistics_cache.GetSummaryStatisticsForProvider(summary); |
| ASSERT_TRUE(sp->GetDurationReference().get().count() > 10); |
| ASSERT_TRUE(sp->GetSummaryCount() == 10); |
| |
| std::string stats_as_json; |
| llvm::raw_string_ostream ss(stats_as_json); |
| ss << sp->ToJSON(); |
| ASSERT_THAT(stats_as_json, ::testing::HasSubstr("\"name\":\"DummySummary\"")); |
| ASSERT_THAT(stats_as_json, ::testing::HasSubstr("\"type\":\"dummy\"")); |
| } |