mirror of
https://github.com/klzgrad/naiveproxy.git
synced 2024-11-24 14:26:09 +03:00
60 lines
1.8 KiB
C++
60 lines
1.8 KiB
C++
// 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
|