Commit 750c6f37 authored by Alexei Filippov's avatar Alexei Filippov Committed by Commit Bot

UMA Sampling heap profiler: Report sample weights.

Use CallStackProfile.Sample.count field for that.

BUG=878604

Change-Id: Ie64d4b173a6b41c0a46d582429b32336fa3fe0cc
Reviewed-on: https://chromium-review.googlesource.com/1197429
Commit-Queue: Alexei Filippov <alph@chromium.org>
Reviewed-by: default avatarMike Wittman <wittman@chromium.org>
Cr-Commit-Position: refs/heads/master@{#589755}
parent 0033da7b
......@@ -115,8 +115,7 @@ void HeapProfilerController::RetrieveAndSendSnapshot() {
module_cache.GetModuleForAddress(address);
frames.emplace_back(address, module);
}
// TODO(alph): Report sample weight.
profile_builder.OnSampleCompleted(std::move(frames));
profile_builder.OnSampleCompleted(std::move(frames), sample.total);
}
profile_builder.OnProfileCompleted(base::TimeDelta(), base::TimeDelta());
......
......@@ -177,6 +177,12 @@ void CallStackProfileBuilder::RecordAnnotations() {
void CallStackProfileBuilder::OnSampleCompleted(
std::vector<base::StackSamplingProfiler::Frame> frames) {
OnSampleCompleted(std::move(frames), 1);
}
void CallStackProfileBuilder::OnSampleCompleted(
std::vector<base::StackSamplingProfiler::Frame> frames,
size_t count) {
// Assemble sample_ from |frames| first.
for (const auto& frame : frames) {
const base::ModuleCache::Module& module(frame.module);
......@@ -206,20 +212,21 @@ void CallStackProfileBuilder::OnSampleCompleted(
if (existing_sample_index != -1) {
CallStackProfile::Sample* sample_proto =
proto_profile_.mutable_deprecated_sample(existing_sample_index);
sample_proto->set_count(sample_proto->count() + 1);
sample_proto->set_count(sample_proto->count() + count);
return;
}
CallStackProfile::Sample* sample_proto =
proto_profile_.add_deprecated_sample();
CopySampleToProto(sample_, modules_, sample_proto);
sample_proto->set_count(1);
sample_proto->set_count(count);
CopyAnnotationsToProto(sample_.process_milestones & ~milestones_,
sample_proto);
milestones_ = sample_.process_milestones;
sample_index_.insert(std::make_pair(
sample_, static_cast<int>(proto_profile_.deprecated_sample_size()) - 1));
std::move(sample_),
static_cast<int>(proto_profile_.deprecated_sample_size()) - 1));
sample_ = Sample();
}
......
......@@ -98,6 +98,11 @@ class CallStackProfileBuilder
void OnProfileCompleted(base::TimeDelta profile_duration,
base::TimeDelta sampling_period) override;
// The function is used by sampling heap profiler. Its samples already come
// with different counts.
void OnSampleCompleted(std::vector<base::StackSamplingProfiler::Frame> frames,
size_t count);
// Sets the callback to use for reporting browser process profiles. This
// indirection is required to avoid a dependency on unnecessary metrics code
// in child processes.
......
......@@ -196,7 +196,7 @@ TEST(CallStackProfileBuilderTest, SamplesDeduped) {
CallStackProfileBuilder::SetProcessMilestone(0);
profile_builder->RecordAnnotations();
profile_builder->OnSampleCompleted(frames);
profile_builder->OnSampleCompleted(frames, 42);
profile_builder->RecordAnnotations();
profile_builder->OnSampleCompleted(frames);
......@@ -214,6 +214,7 @@ TEST(CallStackProfileBuilderTest, SamplesDeduped) {
ASSERT_TRUE(proto.has_call_stack_profile());
ASSERT_EQ(1, proto.call_stack_profile().deprecated_sample_size());
ASSERT_EQ(43, proto.call_stack_profile().deprecated_sample(0).count());
}
TEST(CallStackProfileBuilderTest, SamplesNotDeduped) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment