Index: components/sync/syncable/directory.cc |
diff --git a/components/sync/syncable/directory.cc b/components/sync/syncable/directory.cc |
index 46ee1fcf043a1abe7aa9e0fe340cf24097a0305d..6bba0dc8a0cd5f4f3e2404a4149072ef6fd7cb6f 100644 |
--- a/components/sync/syncable/directory.cc |
+++ b/components/sync/syncable/directory.cc |
@@ -4,6 +4,7 @@ |
#include "components/sync/syncable/directory.h" |
+#include <inttypes.h> |
#include <stddef.h> |
#include <stdint.h> |
@@ -16,10 +17,15 @@ |
#include "base/memory/ptr_util.h" |
#include "base/metrics/histogram_macros.h" |
#include "base/strings/string_number_conversions.h" |
+#include "base/strings/stringprintf.h" |
+#include "base/trace_event/memory_dump_manager.h" |
+#include "base/trace_event/memory_usage_estimators.h" |
+#include "base/trace_event/process_memory_dump.h" |
#include "base/trace_event/trace_event.h" |
#include "components/sync/base/attachment_id_proto.h" |
#include "components/sync/base/unique_position.h" |
#include "components/sync/base/unrecoverable_error_handler.h" |
+#include "components/sync/protocol/proto_size_estimations.h" |
#include "components/sync/syncable/entry.h" |
#include "components/sync/syncable/entry_kernel.h" |
#include "components/sync/syncable/in_memory_directory_backing_store.h" |
@@ -71,6 +77,14 @@ bool Directory::PersistedKernelInfo::HasEmptyDownloadProgress( |
return progress_marker.token().empty(); |
} |
+size_t Directory::PersistedKernelInfo::EstimateMemoryUsage() const { |
+ using base::trace_event::EstimateMemoryUsage; |
+ return EstimateMemoryUsage(store_birthday) + |
+ EstimateMemoryUsage(bag_of_chips) + |
+ EstimateMemoryUsage(datatype_context); |
+ |
+} |
+ |
Directory::SaveChangesSnapshot::SaveChangesSnapshot() |
: kernel_info_status(KERNEL_SHARE_INFO_INVALID) {} |
@@ -889,6 +903,56 @@ size_t Directory::GetEntriesCount() const { |
return kernel_->metahandles_map.size(); |
} |
+void Directory::OnMemoryDump(base::trace_event::ProcessMemoryDump* pmd) { |
+ std::string dump_name_base = base::StringPrintf( |
+ "sync/0x%" PRIXPTR, reinterpret_cast<uintptr_t>(this)); |
+ |
+ size_t kernel_memory_usage; |
+ { |
+ using base::trace_event::EstimateMemoryUsage; |
+ |
+ ScopedKernelLock lock(this); // TODO(dskiba): is this the correct lock? |
+ kernel_memory_usage = |
+ EstimateMemoryUsage(kernel_->name) + |
+ EstimateMemoryUsage(kernel_->metahandles_map) + |
+ EstimateMemoryUsage(kernel_->ids_map) + |
+ EstimateMemoryUsage(kernel_->server_tags_map) + |
+ EstimateMemoryUsage(kernel_->client_tags_map) + |
+ // TODO(dskiba): EstimateMemoryUsage(kernel_->parent_child_index) + |
+ EstimateMemoryUsage(kernel_->index_by_attachment_id) + |
+ EstimateMemoryUsage(kernel_->unapplied_update_metahandles) + |
+ EstimateMemoryUsage(kernel_->unsynced_metahandles) + |
+ EstimateMemoryUsage(kernel_->dirty_metahandles) + |
+ EstimateMemoryUsage(kernel_->metahandles_to_purge) + |
+ EstimateMemoryUsage(kernel_->info_status) + |
+ EstimateMemoryUsage(kernel_->persisted_info) + |
+ EstimateMemoryUsage(kernel_->cache_guid); |
+ } |
+ |
+ { |
+ std::string dump_name = base::StringPrintf( |
+ "%s/kernel", dump_name_base.c_str()); |
+ |
+ auto* dump = pmd->CreateAllocatorDump(dump_name); |
+ dump->AddScalar(base::trace_event::MemoryAllocatorDump::kNameSize, |
+ base::trace_event::MemoryAllocatorDump::kUnitsBytes, |
+ kernel_memory_usage); |
+ const char* system_allocator_name = |
+ base::trace_event::MemoryDumpManager::GetInstance() |
+ ->system_allocator_pool_name(); |
+ if (system_allocator_name) { |
+ pmd->AddSuballocation(dump->guid(), system_allocator_name); |
+ } |
+ } |
+ |
+ if (store_) { |
+ std::string dump_name = base::StringPrintf( |
+ "%s/store", dump_name_base.c_str()); |
+ auto* dump = pmd->CreateAllocatorDump(dump_name); |
+ store_->ReportMemoryUsage(dump); |
+ } |
+} |
+ |
void Directory::SetDownloadProgress( |
ModelType model_type, |
const sync_pb::DataTypeProgressMarker& new_progress) { |