blob: 3871d517979f2d6a1f12f5d38f1ccd4a05c77838 [file] [log] [blame]
// Copyright 2018 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/sampling_heap_profiler/module_cache.h"
#include "base/no_destructor.h"
namespace base {
ModuleCache::Module::Module() : is_valid(false) {}
ModuleCache::Module::Module(uintptr_t base_address,
const std::string& id,
const FilePath& filename)
: Module(base_address, id, filename, 0) {}
ModuleCache::Module::Module(uintptr_t base_address,
const std::string& id,
const FilePath& filename,
size_t size)
: base_address(base_address),
id(id),
filename(filename),
is_valid(true),
size(size) {}
ModuleCache::Module::~Module() = default;
ModuleCache::ModuleCache() = default;
ModuleCache::~ModuleCache() = default;
const ModuleCache::Module& ModuleCache::GetModuleForAddress(uintptr_t address) {
static NoDestructor<Module> invalid_module;
auto it = modules_cache_map_.upper_bound(address);
if (it != modules_cache_map_.begin()) {
DCHECK(!modules_cache_map_.empty());
--it;
Module& module = it->second;
if (address < module.base_address + module.size)
return module;
}
auto module = CreateModuleForAddress(address);
if (!module.is_valid)
return *invalid_module;
return modules_cache_map_.emplace(module.base_address, std::move(module))
.first->second;
}
std::vector<const ModuleCache::Module*> ModuleCache::GetModules() const {
std::vector<const Module*> result;
result.reserve(modules_cache_map_.size());
for (const auto& it : modules_cache_map_)
result.push_back(&it.second);
return result;
}
} // namespace base