text: // Copyright 2015 The Chromium Authors. All rights reserved.
  // Use of this source code is governed by a BSD-style license that can be
  // found in the LICENSE file.
  
  #include "sql/sql_memory_dump_provider.h"
  
  #include "base/trace_event/memory_dump_manager.h"
  #include "base/trace_event/process_memory_dump.h"
  #include "third_party/sqlite/sqlite3.h"
  
  namespace sql {
  
  // static
  SqlMemoryDumpProvider* SqlMemoryDumpProvider::GetInstance() {
    return base::Singleton<
        SqlMemoryDumpProvider,
        base::LeakySingletonTraits<SqlMemoryDumpProvider>>::get();
  }
  
  SqlMemoryDumpProvider::SqlMemoryDumpProvider() {}
  
  SqlMemoryDumpProvider::~SqlMemoryDumpProvider() {}
  
  bool SqlMemoryDumpProvider::OnMemoryDump(
      const base::trace_event::MemoryDumpArgs& args,
      base::trace_event::ProcessMemoryDump* pmd) {
    int memory_used = 0;
    int memory_high_water = 0;
    int status = sqlite3_status(SQLITE_STATUS_MEMORY_USED, &memory_used,
                                &memory_high_water, 1 /*resetFlag */);
    if (status != SQLITE_OK)
      return false;
  
    base::trace_event::MemoryAllocatorDump* dump =
        pmd->CreateAllocatorDump("sqlite");
    dump->AddScalar(base::trace_event::MemoryAllocatorDump::kNameSize,
                    base::trace_event::MemoryAllocatorDump::kUnitsBytes,
                    memory_used);
    dump->AddScalar("malloc_high_wmark_size",
                    base::trace_event::MemoryAllocatorDump::kUnitsBytes,
                    memory_high_water);
  
    int dummy_high_water = -1;
    int malloc_count = -1;
    status = sqlite3_status(SQLITE_STATUS_MALLOC_COUNT, &malloc_count,
                            &dummy_high_water, 0 /* resetFlag */);
    if (status == SQLITE_OK) {
      dump->AddScalar("malloc_count",
                      base::trace_event::MemoryAllocatorDump::kUnitsObjects,
                      malloc_count);
    }
  
    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;
  }
  
  }  // namespace sql
  