#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 using namespace lldb_private; using Duration = std::chrono::duration; 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 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\"")); }