Index: extensions/browser/value_store/leveldb_value_store.cc |
diff --git a/extensions/browser/value_store/leveldb_value_store.cc b/extensions/browser/value_store/leveldb_value_store.cc |
index 39a1346df7d2c2ca41d92585254cf4401e397436..c11e6551b280a99cbc983f1c3adec6d4670dbc01 100644 |
--- a/extensions/browser/value_store/leveldb_value_store.cc |
+++ b/extensions/browser/value_store/leveldb_value_store.cc |
@@ -8,9 +8,13 @@ |
#include "base/json/json_reader.h" |
#include "base/json/json_writer.h" |
#include "base/logging.h" |
+#include "base/strings/string_number_conversions.h" |
#include "base/strings/string_util.h" |
#include "base/strings/stringprintf.h" |
#include "base/strings/sys_string_conversions.h" |
+#include "base/thread_task_runner_handle.h" |
+#include "base/trace_event/memory_dump_manager.h" |
+#include "base/trace_event/process_memory_dump.h" |
#include "content/public/browser/browser_thread.h" |
#include "extensions/browser/value_store/value_store_util.h" |
#include "third_party/leveldatabase/env_chromium.h" |
@@ -59,10 +63,14 @@ LeveldbValueStore::LeveldbValueStore(const std::string& uma_client_name, |
"Extensions.Database.Open." + uma_client_name, 1, |
leveldb_env::LEVELDB_STATUS_MAX, leveldb_env::LEVELDB_STATUS_MAX + 1, |
base::Histogram::kUmaTargetedHistogramFlag); |
+ base::trace_event::MemoryDumpManager::GetInstance()->RegisterDumpProvider( |
+ this, "LeveldbValueStore", base::ThreadTaskRunnerHandle::Get()); |
} |
LeveldbValueStore::~LeveldbValueStore() { |
DCHECK_CURRENTLY_ON(BrowserThread::FILE); |
+ base::trace_event::MemoryDumpManager::GetInstance()->UnregisterDumpProvider( |
+ this); |
// Delete the database from disk if it's empty (but only if we managed to |
// open it!). This is safe on destruction, assuming that we have exclusive |
@@ -325,6 +333,38 @@ bool LeveldbValueStore::WriteToDbForTest(leveldb::WriteBatch* batch) { |
return !WriteToDb(batch).get(); |
} |
+bool LeveldbValueStore::OnMemoryDump( |
+ const base::trace_event::MemoryDumpArgs& args, |
+ base::trace_event::ProcessMemoryDump* pmd) { |
+ DCHECK_CURRENTLY_ON(BrowserThread::FILE); |
+ |
+ // Return true so that the provider is not disabled. |
+ if (!db_) |
+ return true; |
+ |
+ std::string value; |
+ uint64 size; |
+ bool res = db_->GetProperty("leveldb.approximate-memory-usage", &value); |
+ DCHECK(res); |
+ res = base::StringToUint64(value, &size); |
+ DCHECK(res); |
+ |
+ auto dump = pmd->CreateAllocatorDump( |
+ base::StringPrintf("leveldb/value_store/%s/%p", |
+ open_histogram_->histogram_name().c_str(), this)); |
+ dump->AddScalar(base::trace_event::MemoryAllocatorDump::kNameSize, |
+ base::trace_event::MemoryAllocatorDump::kUnitsBytes, size); |
+ |
+ // Memory is allocated from system allocator (malloc). |
+ 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); |
+ |
+ return true; |
+} |
+ |
scoped_ptr<ValueStore::Error> LeveldbValueStore::EnsureDbIsOpen() { |
DCHECK_CURRENTLY_ON(BrowserThread::FILE); |