| // Copyright 2015 The Chromium Authors |
| // 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<cstdint> |
| |
| #include"base/check_op.h" |
| #include"base/memory/singleton.h" |
| #include"base/trace_event/memory_allocator_dump.h" |
| #include"base/trace_event/memory_dump_manager.h" |
| #include"base/trace_event/memory_dump_request_args.h" |
| #include"base/trace_event/process_memory_dump.h" |
| #include"sql/sqlite_result_code.h" |
| #include"sql/sqlite_result_code_values.h" |
| #include"third_party/sqlite/sqlite3.h" |
| |
| namespace sql{ |
| |
| // static |
| SqlMemoryDumpProvider*SqlMemoryDumpProvider::GetInstance(){ |
| return base::Singleton< |
| SqlMemoryDumpProvider, |
| base::LeakySingletonTraits<SqlMemoryDumpProvider>>::get(); |
| } |
| |
| // static |
| int64_tSqlMemoryDumpProvider::GetMemoryUse(int64_t* high_water){ |
| sqlite3_int64 memory_used=0; |
| sqlite3_int64 memory_high_water=0; |
| auto result_code=ToSqliteResultCode(sqlite3_status64( |
| SQLITE_STATUS_MEMORY_USED,&memory_used,&memory_high_water, |
| /*resetFlag=*/high_water?1:0)); |
| DCHECK_EQ(result_code,SqliteResultCode::kOk) |
| <<"sqlite3_status64(STATUS_MEMORY_USED) failed"; |
| if(high_water){ |
| *high_water= memory_high_water; |
| } |
| return memory_used; |
| } |
| |
| SqlMemoryDumpProvider::SqlMemoryDumpProvider()=default; |
| |
| SqlMemoryDumpProvider::~SqlMemoryDumpProvider()=default; |
| |
| boolSqlMemoryDumpProvider::OnMemoryDump( |
| const base::trace_event::MemoryDumpArgs& args, |
| base::trace_event::ProcessMemoryDump* pmd){ |
| int64_t memory_high_water=0; |
| int64_t memory_used=GetMemoryUse(&memory_high_water); |
| |
| 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; |
| auto sqlite_result_code=ToSqliteResultCode(sqlite3_status64( |
| SQLITE_STATUS_MALLOC_COUNT,&malloc_count,&dummy_high_water, |
| /*resetFlag=*/0)); |
| DCHECK_EQ(sqlite_result_code,SqliteResultCode::kOk) |
| <<"sqlite3_status64(SQLITE_STATUS_MALLOC_COUNT) failed"; |
| dump->AddScalar("malloc_count", |
| base::trace_event::MemoryAllocatorDump::kUnitsObjects, |
| malloc_count); |
| |
| constchar* system_allocator_name= |
| base::trace_event::MemoryDumpManager::GetInstance() |
| ->system_allocator_pool_name(); |
| if(system_allocator_name){ |
| pmd->AddSuballocation(dump->guid(), system_allocator_name); |
| } |
| returntrue; |
| } |
| |
| }// namespace sql |