blob: 8bce4dc5768e8bc41593db1f44cbd46e7aa0d311 [file] [log] [blame]
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "services/device/compute_pressure/virtual_probes_manager.h"
#include <memory>
#include "base/time/time.h"
#include "services/device/compute_pressure/virtual_cpu_probe_manager.h"
#include "services/device/public/mojom/pressure_manager.mojom.h"
namespace device {
namespace {
// We need a shorter interval when using virtual probes because some rate
// obfuscation web tests require 50-100 updates to trigger the mitigation, and
// sampling once per second (per PressureManagerImpl::kDefaultSamplingInterval)
// takes too long.
constexpr base::TimeDelta kVirtualProbeSamplingInterval =
base::Milliseconds(100);
} // namespace
VirtualProbesManager::VirtualProbesManager(base::TimeDelta sampling_interval)
: ProbesManager(sampling_interval) {}
VirtualProbesManager::~VirtualProbesManager() = default;
bool VirtualProbesManager::AddOverrideForSource(
mojom::PressureSource source,
mojom::VirtualPressureSourceMetadataPtr metadata) {
if (overridden_sources_.Has(source)) {
return false;
}
overridden_sources_.Put(source);
switch (source) {
case mojom::PressureSource::kCpu: {
std::unique_ptr<CpuProbeManager> manager =
metadata->available
? VirtualCpuProbeManager::Create(kVirtualProbeSamplingInterval,
cpu_probe_sampling_callback())
: nullptr;
set_cpu_probe_manager(std::move(manager));
break;
}
}
return true;
}
void VirtualProbesManager::RemoveOverrideForSource(
mojom::PressureSource source) {
if (!overridden_sources_.Has(source)) {
return;
}
overridden_sources_.Remove(source);
switch (source) {
case mojom::PressureSource::kCpu: {
set_cpu_probe_manager(nullptr);
break;
}
}
}
void VirtualProbesManager::AddDataUpdate(mojom::PressureSource source,
mojom::PressureState state,
double own_contribution_estimate) {
if (!overridden_sources_.Has(source)) {
return;
}
switch (source) {
case mojom::PressureSource::kCpu: {
if (auto* manager = cpu_probe_manager()) {
static_cast<VirtualCpuProbeManager*>(manager)->SetPressureState(state);
static_cast<VirtualCpuProbeManager*>(manager)
->SetOwnContributionEstimate(own_contribution_estimate);
}
break;
}
}
}
bool VirtualProbesManager::IsOverriding(mojom::PressureSource source) const {
return overridden_sources_.Has(source);
}
} // namespace device