blob: b25b994637b05157839487add8df663de7130804 [file] [log] [blame]
// Copyright 2021 The Fuchsia 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 "src/sys/fuzzing/framework/engine/module-pool.h"
#include <iomanip>
#include <sstream>
namespace fuzzing {
ModuleProxy* ModulePool::Get(const std::string& id, size_t size) {
std::ostringstream oss;
oss << id << std::setw(16) << std::setfill('0') << ":" << size;
auto key = oss.str();
auto& module = modules_[key];
if (!module) {
module = std::make_unique<ModuleProxy>(id, size);
}
return module.get();
}
void ModulePool::ForEachModule(fit::function<void(ModuleProxy&)> func) {
for (auto& kv : modules_) {
func(*kv.second);
}
}
size_t ModulePool::Measure() {
size_t count = 0;
ForEachModule([&count](ModuleProxy& module) { count += module.Measure(); });
return count;
}
size_t ModulePool::Accumulate() {
size_t count = 0;
ForEachModule([&count](ModuleProxy& module) { count += module.Accumulate(); });
return count;
}
size_t ModulePool::GetCoverage(size_t* out_num_features) {
size_t num_pcs = 0;
size_t num_features = 0;
ForEachModule([&num_pcs, &num_features](ModuleProxy& module) {
size_t tmp_features;
num_pcs += module.GetCoverage(&tmp_features);
num_features += tmp_features;
});
if (out_num_features) {
*out_num_features = num_features;
}
return num_pcs;
}
void ModulePool::Clear() {
ForEachModule([](ModuleProxy& module) { module.Clear(); });
}
} // namespace fuzzing