// 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() = default;

SqlMemoryDumpProvider::~SqlMemoryDumpProvider() = default;

bool SqlMemoryDumpProvider::OnMemoryDump(
    const base::trace_event::MemoryDumpArgs& args,
    base::trace_event::ProcessMemoryDump* pmd) {
  sqlite3_int64 memory_used = 0;
  sqlite3_int64 memory_high_water = 0;
  int status = sqlite3_status64(SQLITE_STATUS_MEMORY_USED, &memory_used,
                                &memory_high_water, /* resetFlag= */ 1);
  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);

  sqlite3_int64 dummy_high_water = -1;
  sqlite3_int64 malloc_count = -1;
  status = sqlite3_status64(SQLITE_STATUS_MALLOC_COUNT, &malloc_count,
                            &dummy_high_water, /* resetFlag= */ 0);
  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
