| Index: components/metrics/leak_detector/leak_detector_impl.cc
|
| diff --git a/components/metrics/leak_detector/leak_detector_impl.cc b/components/metrics/leak_detector/leak_detector_impl.cc
|
| index ba55ad5171785d5b65f4826eb9a6403cff98eeab..d387b51f184bac4fa197132570be48888f7f634a 100644
|
| --- a/components/metrics/leak_detector/leak_detector_impl.cc
|
| +++ b/components/metrics/leak_detector/leak_detector_impl.cc
|
| @@ -10,6 +10,7 @@
|
| #include <algorithm> // For std::move
|
| #include <iterator> // For std::advance
|
| #include <new>
|
| +#include <utility>
|
|
|
| #include "base/hash.h"
|
| #include "base/process/process_handle.h"
|
| @@ -184,6 +185,8 @@ void LeakDetectorImpl::TestForLeaks(InternalVector<LeakReport>* reports) {
|
|
|
| RecordCurrentAllocationDataInHistory();
|
|
|
| + UpdateLeakCooldowns();
|
| +
|
| // Get suspected leaks by size.
|
| for (const ValueType& size_value : size_leak_analyzer_.suspected_leaks()) {
|
| uint32_t size = size_value.size();
|
| @@ -215,6 +218,9 @@ void LeakDetectorImpl::TestForLeaks(InternalVector<LeakReport>* reports) {
|
| for (const ValueType& call_stack_value : leak_analyzer.suspected_leaks()) {
|
| const CallStack* call_stack = call_stack_value.call_stack();
|
|
|
| + if (!ReadyToGenerateReport(size, call_stack))
|
| + continue;
|
| +
|
| // Return reports by storing in |*reports|.
|
| reports->resize(reports->size() + 1);
|
| LeakReport* report = &reports->back();
|
| @@ -225,6 +231,7 @@ void LeakDetectorImpl::TestForLeaks(InternalVector<LeakReport>* reports) {
|
| }
|
|
|
| StoreHistoricalDataInReport(size, call_stack, report);
|
| + ResetLeakCooldown(size, call_stack);
|
| }
|
| }
|
| }
|
| @@ -312,5 +319,30 @@ void LeakDetectorImpl::StoreHistoricalDataInReport(size_t size,
|
| }
|
| }
|
|
|
| +bool LeakDetectorImpl::ReadyToGenerateReport(
|
| + size_t size,
|
| + const CallStack* call_stack) const {
|
| + return cooldowns_per_leak_.find(std::make_pair(size, call_stack)) ==
|
| + cooldowns_per_leak_.end();
|
| +}
|
| +
|
| +void LeakDetectorImpl::ResetLeakCooldown(size_t size,
|
| + const CallStack* call_stack) {
|
| + cooldowns_per_leak_[std::make_pair(size, call_stack)] =
|
| + kNumSizeEntriesInHistory;
|
| +}
|
| +
|
| +void LeakDetectorImpl::UpdateLeakCooldowns() {
|
| + for (auto iter = cooldowns_per_leak_.begin();
|
| + iter != cooldowns_per_leak_.end();
|
| + /* No iterating here */) {
|
| + if (--iter->second > 0) {
|
| + ++iter;
|
| + } else {
|
| + cooldowns_per_leak_.erase(iter++);
|
| + }
|
| + }
|
| +}
|
| +
|
| } // namespace leak_detector
|
| } // namespace metrics
|
|
|