blob: aed187fa1d8e700b4a45669766f7dba824543d26 [file] [log] [blame]
// Copyright 2016 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 "base/trace_event/memory_infra_background_whitelist.h"
#include <ctype.h>
#include <string.h>
#include <string>
namespace base {
namespace trace_event {
namespace {
// The names of dump providers whitelisted for background tracing. Dump
// providers can be added here only if the background mode dump has very
// less performance and memory overhead.
const char* const kDumpProviderWhitelist[] = {
"BlinkGC",
"ChildDiscardableSharedMemoryManager",
"DOMStorage",
"HostDiscardableSharedMemoryManager",
"IndexedDBBackingStore",
"JavaHeap",
"LeveldbValueStore",
"Malloc",
"PartitionAlloc",
"ProcessMemoryMetrics",
"Skia",
"Sql",
"V8Isolate",
"WinHeap",
nullptr // End of list marker.
};
// A list of string names that are allowed for the memory allocator dumps in
// background mode.
const char* const kAllocatorDumpNameWhitelist[] = {
"blink_gc",
"blink_gc/allocated_objects",
"discardable",
"discardable/child_0x?",
"dom_storage/0x?/cache_size",
"dom_storage/session_storage_0x?",
"java_heap",
"java_heap/allocated_objects",
"leveldb/index_db/0x?",
"leveldb/value_store/Extensions.Database.Open.Settings/0x?",
"leveldb/value_store/Extensions.Database.Open.Rules/0x?",
"leveldb/value_store/Extensions.Database.Open.State/0x?",
"leveldb/value_store/Extensions.Database.Open/0x?",
"leveldb/value_store/Extensions.Database.Restore/0x?",
"leveldb/value_store/Extensions.Database.Value.Restore/0x?",
"malloc",
"malloc/allocated_objects",
"malloc/metadata_fragmentation_caches",
"partition_alloc/allocated_objects",
"partition_alloc/partitions",
"partition_alloc/partitions/buffer",
"partition_alloc/partitions/fast_malloc",
"partition_alloc/partitions/layout",
"skia/sk_glyph_cache",
"skia/sk_resource_cache",
"sqlite",
"v8/isolate_0x?/heap_spaces",
"v8/isolate_0x?/heap_spaces/code_space",
"v8/isolate_0x?/heap_spaces/large_object_space",
"v8/isolate_0x?/heap_spaces/map_space",
"v8/isolate_0x?/heap_spaces/new_space",
"v8/isolate_0x?/heap_spaces/old_space",
"v8/isolate_0x?/heap_spaces/other_spaces",
"v8/isolate_0x?/malloc",
"v8/isolate_0x?/zapped_for_debug",
"winheap",
"winheap/allocated_objects",
nullptr // End of list marker.
};
const char* const* g_dump_provider_whitelist = kDumpProviderWhitelist;
const char* const* g_allocator_dump_name_whitelist =
kAllocatorDumpNameWhitelist;
} // namespace
bool IsMemoryDumpProviderWhitelisted(const char* mdp_name) {
for (size_t i = 0; g_dump_provider_whitelist[i] != nullptr; ++i) {
if (strcmp(mdp_name, g_dump_provider_whitelist[i]) == 0)
return true;
}
return false;
}
bool IsMemoryAllocatorDumpNameWhitelisted(const std::string& name) {
// Remove special characters, numbers (including hexadecimal which are marked
// by '0x') from the given string.
const size_t length = name.size();
std::string stripped_str;
stripped_str.reserve(length);
bool parsing_hex = false;
for (size_t i = 0; i < length; ++i) {
if (parsing_hex && isxdigit(name[i]))
continue;
parsing_hex = false;
if (i + 1 < length && name[i] == '0' && name[i + 1] == 'x') {
parsing_hex = true;
stripped_str.append("0x?");
++i;
} else {
stripped_str.push_back(name[i]);
}
}
for (size_t i = 0; g_allocator_dump_name_whitelist[i] != nullptr; ++i) {
if (stripped_str == g_allocator_dump_name_whitelist[i]) {
return true;
}
}
return false;
}
void SetDumpProviderWhitelistForTesting(const char* const* list) {
g_dump_provider_whitelist = list;
}
void SetAllocatorDumpNameWhitelistForTesting(const char* const* list) {
g_allocator_dump_name_whitelist = list;
}
} // namespace trace_event
} // namespace base