Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(476)

Unified Diff: components/metrics/leak_detector/leak_detector.cc

Issue 1868193003: Store alloc history data in memory leak report protobuf (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@leak-history
Patch Set: Call MergeFrom(); Update comment about repeated fields; Use braces for single-line for loops Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: components/metrics/leak_detector/leak_detector.cc
diff --git a/components/metrics/leak_detector/leak_detector.cc b/components/metrics/leak_detector/leak_detector.cc
index a7151a86382990e1313982dc2be1c41bfd2d287b..31c72f370a97dc94d7b3dafb385c253da9d42eaf 100644
--- a/components/metrics/leak_detector/leak_detector.cc
+++ b/components/metrics/leak_detector/leak_detector.cc
@@ -6,6 +6,8 @@
#include <stdint.h>
+#include <algorithm>
+
#include "base/allocator/allocator_extension.h"
#include "base/bind.h"
#include "base/lazy_instance.h"
@@ -24,7 +26,6 @@
namespace metrics {
-using LeakReport = LeakDetector::LeakReport;
using InternalLeakReport = leak_detector::LeakDetectorImpl::LeakReport;
template <typename T>
using InternalVector = leak_detector::LeakDetectorImpl::InternalVector<T>;
@@ -100,25 +101,25 @@ inline uint64_t PointerToHash(const void* ptr) {
return reinterpret_cast<uint64_t>(ptr) * kMultiplier;
}
-// Converts a vector of leak reports generated by LeakDetectorImpl
-// (InternalLeakReport) to a vector of leak reports suitable for sending to
-// LeakDetector's observers (LeakReport).
-void GetReportsForObservers(
- const InternalVector<InternalLeakReport>& leak_reports,
- std::vector<LeakReport>* reports_for_observers) {
- reports_for_observers->clear();
- reports_for_observers->reserve(leak_reports.size());
- for (const InternalLeakReport& report : leak_reports) {
- reports_for_observers->push_back(LeakReport());
- LeakReport* new_report = &reports_for_observers->back();
-
- new_report->alloc_size_bytes = report.alloc_size_bytes();
- if (!report.call_stack().empty()) {
- new_report->call_stack.resize(report.call_stack().size());
- memcpy(new_report->call_stack.data(), report.call_stack().data(),
- report.call_stack().size() * sizeof(report.call_stack()[0]));
- }
+// Converts an memory leak report generated by LeakDetectorImpl
+// (InternalLeakReport) to protobuf format (MemoryLeakReportProto).
+MemoryLeakReportProto ConvertLeakReportToProto(
+ const InternalLeakReport& report) {
+ MemoryLeakReportProto proto;
+
+ proto.set_size_bytes(report.alloc_size_bytes());
+ for (auto call_stack_entry : report.call_stack()) {
+ proto.add_call_stack(call_stack_entry);
+ }
+
+ for (const auto& entry : report.alloc_breakdown_history()) {
+ auto* proto_entry = proto.add_alloc_breakdown_history();
+ for (const uint32_t count : entry.counts_by_size)
+ proto_entry->add_counts_by_size(count);
Ilya Sherman 2016/04/14 02:30:04 nit: Curly braces here too
Simon Que 2016/04/14 03:04:49 Done.
+ proto_entry->set_count_for_call_stack(entry.count_for_call_stack);
}
+
+ return proto;
}
// The only instance of LeakDetector that should be used.
@@ -153,12 +154,6 @@ inline void StoreHookDataToTLS(HookData hook_data) {
} // namespace
-LeakDetector::LeakReport::LeakReport() {}
-
-LeakDetector::LeakReport::LeakReport(const LeakReport& other) = default;
-
-LeakDetector::LeakReport::~LeakReport() {}
-
// static
LeakDetector* LeakDetector::GetInstance() {
return g_instance.Pointer();
@@ -274,9 +269,10 @@ void LeakDetector::AllocHook(const void* ptr, size_t size) {
detector->impl_->TestForLeaks(&leak_reports);
// Pass leak reports to observers.
- std::vector<LeakReport> leak_reports_for_observers;
- GetReportsForObservers(leak_reports, &leak_reports_for_observers);
- detector->NotifyObservers(leak_reports_for_observers);
+ std::vector<MemoryLeakReportProto> leak_report_protos;
+ std::transform(leak_reports.begin(), leak_reports.end(),
+ leak_report_protos.begin(), &ConvertLeakReportToProto);
+ detector->NotifyObservers(leak_report_protos);
}
}
@@ -319,7 +315,8 @@ inline bool LeakDetector::ShouldSample(const void* ptr) const {
return PointerToHash(ptr) < sampling_factor_;
}
-void LeakDetector::NotifyObservers(const std::vector<LeakReport>& reports) {
+void LeakDetector::NotifyObservers(
+ const std::vector<MemoryLeakReportProto>& reports) {
if (reports.empty())
return;
@@ -331,9 +328,9 @@ void LeakDetector::NotifyObservers(const std::vector<LeakReport>& reports) {
return;
}
- for (const LeakReport& report : reports) {
+ {
base::AutoLock lock(observers_lock_);
- FOR_EACH_OBSERVER(Observer, observers_, OnLeakFound(report));
+ FOR_EACH_OBSERVER(Observer, observers_, OnLeaksFound(reports));
}
}
« no previous file with comments | « components/metrics/leak_detector/leak_detector.h ('k') | components/metrics/leak_detector/leak_detector_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698