
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.
59 lines
1.8 KiB
C++
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\""));
|
|
}
|