llvm-project/lldb/unittests/Target/SummaryStatisticsTest.cpp
Jacob Lalonde 22144e20cb
[LLDB][Data Formatters] Calculate average and total time for summary providers within lldb (#102708)
This PR adds a statistics provider cache, which allows an individual
target to keep a rolling tally of it's total time and number of
invocations for a given summary provider. This information is then
available in statistics dump to help slow summary providers, and gleam
more into insight into LLDB's time use.
2024-09-10 09:58:43 -07:00

59 lines
1.8 KiB
C++

#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\""));
}