blob: 052aa7e87e1929c3f0636ea9cc07529f2725c7f7 [file] [log] [blame]
// Copyright 2019 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 "components/gwp_asan/client/sampling_helpers.h"
#include <string>
#include <utility>
#include "base/bind.h"
#include "base/bind_helpers.h"
#include "base/metrics/histogram_functions.h"
#include "base/numerics/safe_math.h"
#include "base/strings/stringprintf.h"
namespace gwp_asan {
namespace internal {
namespace {
// Turns the value passed to --type= into a string used in a histogram name for
// common processes, or nullptr otherwise.
const char* ProcessString(const char* process_type) {
if (!process_type)
return nullptr;
if (!strcmp(process_type, ""))
return "Browser";
if (!strcmp(process_type, "extension"))
return "Extension";
if (!strcmp(process_type, "gpu-process"))
return "Gpu";
if (!strcmp(process_type, "ppapi"))
return "Ppapi";
if (!strcmp(process_type, "renderer"))
return "Renderer";
if (!strcmp(process_type, "utility"))
return "Utility";
return nullptr;
}
void ReportOomHistogram(std::string histogram_name,
size_t sampling_frequency,
size_t allocations) {
base::CheckedNumeric<int> total_allocations = allocations;
total_allocations *= sampling_frequency;
if (total_allocations.IsValid()) {
base::UmaHistogramCustomCounts(/*name=*/histogram_name,
/*sample=*/total_allocations.ValueOrDie(),
/*min=*/1, /*max=*/100000000,
/*buckets=*/100);
}
}
} // namespace
GuardedPageAllocator::OutOfMemoryCallback CreateOomCallback(
const char* allocator_name,
const char* process_type,
size_t sampling_frequency) {
const char* process_str = ProcessString(process_type);
if (!process_str)
return base::DoNothing();
std::string histogram_name = base::StringPrintf("GwpAsan.AllocatorOom.%s.%s",
allocator_name, process_str);
return base::BindOnce(&ReportOomHistogram, std::move(histogram_name),
sampling_frequency);
}
} // namespace internal
} // namespace gwp_asan