// 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 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 ModuleCache::GetModules() const { std::vector result; result.reserve(modules_cache_map_.size()); for (const auto& it : modules_cache_map_) result.push_back(&it.second); return result; } } // namespace base