blob: e2ad128f8faf2ff59626e3cd02ee2533f1f575c1 [file] [log] [blame]
// 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 "skia/ext/skia_trace_memory_dump_impl.h"
#include "base/trace_event/memory_allocator_dump.h"
#include "base/trace_event/memory_dump_manager.h"
#include "base/trace_event/process_memory_dump.h"
#include "skia/ext/SkDiscardableMemory_chrome.h"
namespace skia {
namespace {
const char kMallocBackingType[] = "malloc";
}
SkiaTraceMemoryDumpImpl::SkiaTraceMemoryDumpImpl(
base::trace_event::MemoryDumpLevelOfDetail level_of_detail,
base::trace_event::ProcessMemoryDump* process_memory_dump)
: SkiaTraceMemoryDumpImpl("", level_of_detail, process_memory_dump) {}
SkiaTraceMemoryDumpImpl::SkiaTraceMemoryDumpImpl(
const std::string& dump_name_prefix,
base::trace_event::MemoryDumpLevelOfDetail level_of_detail,
base::trace_event::ProcessMemoryDump* process_memory_dump)
: dump_name_prefix_(dump_name_prefix),
process_memory_dump_(process_memory_dump),
request_level_(
level_of_detail == base::trace_event::MemoryDumpLevelOfDetail::kLight
? SkTraceMemoryDump::kLight_LevelOfDetail
: SkTraceMemoryDump::kObjectsBreakdowns_LevelOfDetail) {}
SkiaTraceMemoryDumpImpl::~SkiaTraceMemoryDumpImpl() = default;
void SkiaTraceMemoryDumpImpl::dumpNumericValue(const char* dumpName,
const char* valueName,
const char* units,
uint64_t value) {
auto* dump = process_memory_dump_->GetOrCreateAllocatorDump(dumpName);
dump->AddScalar(valueName, units, value);
}
void SkiaTraceMemoryDumpImpl::dumpStringValue(const char* dump_name,
const char* value_name,
const char* value) {
auto* dump = process_memory_dump_->GetOrCreateAllocatorDump(dump_name);
dump->AddString(value_name, "", value);
}
void SkiaTraceMemoryDumpImpl::setMemoryBacking(const char* dumpName,
const char* backingType,
const char* backingObjectId) {
if (strcmp(backingType, kMallocBackingType) == 0) {
auto* dump = process_memory_dump_->GetOrCreateAllocatorDump(dumpName);
const char* system_allocator_name =
base::trace_event::MemoryDumpManager::GetInstance()
->system_allocator_pool_name();
if (system_allocator_name) {
process_memory_dump_->AddSuballocation(dump->guid(),
system_allocator_name);
}
} else {
NOTREACHED();
}
}
void SkiaTraceMemoryDumpImpl::setDiscardableMemoryBacking(
const char* dumpName,
const SkDiscardableMemory& discardableMemoryObject) {
std::string name = dump_name_prefix_ + dumpName;
DCHECK(!process_memory_dump_->GetAllocatorDump(name));
const SkDiscardableMemoryChrome& discardable_memory_obj =
static_cast<const SkDiscardableMemoryChrome&>(discardableMemoryObject);
auto* dump = discardable_memory_obj.CreateMemoryAllocatorDump(
name.c_str(), process_memory_dump_);
DCHECK(dump);
}
SkTraceMemoryDump::LevelOfDetail SkiaTraceMemoryDumpImpl::getRequestedDetails()
const {
return request_level_;
}
bool SkiaTraceMemoryDumpImpl::shouldDumpWrappedObjects() const {
// Chrome already dumps objects it imports into Skia. Avoid duplicate dumps
// by asking Skia not to dump them.
return false;
}
} // namespace skia