Index: components/sync/syncable/directory.cc |
diff --git a/components/sync/syncable/directory.cc b/components/sync/syncable/directory.cc |
index c0a579e52a67555f48b469802f6a1b03fec3d956..14e0765e51b6738709fdfa3c026b49bbd6c38142 100644 |
--- a/components/sync/syncable/directory.cc |
+++ b/components/sync/syncable/directory.cc |
@@ -987,6 +987,42 @@ void Directory::OnMemoryDump(base::trace_event::ProcessMemoryDump* pmd) { |
} |
} |
+// Iterates over entries of |map|, sums memory usage estimate of entries whose |
+// entry type is |model_type|. Passing owning container will also include memory |
+// estimate of EntryKernel. |
+template <typename Container> |
+size_t EstimateFiteredMapMemoryUsage(const Container& map, |
+ ModelType model_type) { |
+ using base::trace_event::EstimateMemoryUsage; |
+ size_t memory_usage = 0; |
+ for (const auto& kv : map) { |
+ const ModelType entry_type = |
+ GetModelTypeFromSpecifics(kv.second->ref(SPECIFICS)); |
+ if (entry_type == model_type) { |
+ memory_usage += EstimateMemoryUsage(kv); |
+ } |
+ } |
+ return memory_usage; |
+} |
+ |
+size_t Directory::EstimateMemoryUsageByType(ModelType model_type) { |
+ using base::trace_event::EstimateMemoryUsage; |
+ ReadTransaction trans(FROM_HERE, this); |
+ ScopedKernelLock lock(this); |
+ |
+ size_t memory_usage = 0; |
+ memory_usage += |
+ EstimateFiteredMapMemoryUsage(kernel_->metahandles_map, model_type); |
+ memory_usage += EstimateFiteredMapMemoryUsage(kernel_->ids_map, model_type); |
+ memory_usage += |
+ EstimateFiteredMapMemoryUsage(kernel_->server_tags_map, model_type); |
+ memory_usage += |
+ EstimateFiteredMapMemoryUsage(kernel_->client_tags_map, model_type); |
+ memory_usage += EstimateMemoryUsage( |
+ kernel_->persisted_info.download_progress[model_type]); |
+ return memory_usage; |
+} |
+ |
void Directory::SetDownloadProgress( |
ModelType model_type, |
const sync_pb::DataTypeProgressMarker& new_progress) { |
@@ -1174,13 +1210,12 @@ void Directory::GetMetaHandlesOfType(const ScopedKernelLock& lock, |
ModelType type, |
std::vector<int64_t>* result) { |
result->clear(); |
- for (MetahandlesMap::iterator it = kernel_->metahandles_map.begin(); |
- it != kernel_->metahandles_map.end(); ++it) { |
- EntryKernel* entry = it->second.get(); |
+ for (const auto& handle_and_kernel : kernel_->metahandles_map) { |
+ EntryKernel* entry = handle_and_kernel.second.get(); |
const ModelType entry_type = |
GetModelTypeFromSpecifics(entry->ref(SPECIFICS)); |
if (entry_type == type) |
- result->push_back(it->first); |
+ result->push_back(handle_and_kernel.first); |
} |
} |