1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
|
// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/memory/enterprise_memory_limit_pref_observer.h"
#include "base/functional/bind.h"
#include "base/memory/memory_pressure_monitor.h"
#include "build/build_config.h"
#include "chrome/browser/resource_coordinator/utils.h"
#include "chrome/common/pref_names.h"
#include "components/memory_pressure/multi_source_memory_pressure_monitor.h"
#if !BUILDFLAG(IS_ANDROID)
#include "chrome/browser/resource_coordinator/tab_lifecycle_unit_source.h"
#endif
namespace memory {
namespace {
const int kMinimalResidentSetLimitMb = 1024;
} // namespace
EnterpriseMemoryLimitPrefObserver::EnterpriseMemoryLimitPrefObserver(
PrefService* pref_service)
: pref_service_(pref_service) {
DCHECK(pref_service_);
DCHECK(base::MemoryPressureMonitor::Get());
evaluator_ = std::make_unique<EnterpriseMemoryLimitEvaluator>(
static_cast<memory_pressure::MultiSourceMemoryPressureMonitor*>(
base::MemoryPressureMonitor::Get())
->CreateVoter());
pref_change_registrar_.Init(pref_service_);
pref_change_registrar_.Add(
prefs::kTotalMemoryLimitMb,
base::BindRepeating(&EnterpriseMemoryLimitPrefObserver::GetPref,
base::Unretained(this)));
GetPref();
}
EnterpriseMemoryLimitPrefObserver::~EnterpriseMemoryLimitPrefObserver() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
if (evaluator_->IsRunning()) {
#if !BUILDFLAG(IS_ANDROID)
resource_coordinator::GetTabLifecycleUnitSource()
->SetMemoryLimitEnterprisePolicyFlag(false);
#endif
evaluator_->Stop();
}
}
bool EnterpriseMemoryLimitPrefObserver::PlatformIsSupported() {
#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC)
return true;
#else
return false;
#endif
}
// static
void EnterpriseMemoryLimitPrefObserver::RegisterPrefs(
PrefRegistrySimple* registry) {
registry->RegisterIntegerPref(prefs::kTotalMemoryLimitMb,
kMinimalResidentSetLimitMb);
}
void EnterpriseMemoryLimitPrefObserver::GetPref() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
const PrefService::Preference* pref =
pref_service_->FindPreference(prefs::kTotalMemoryLimitMb);
if (pref->IsManaged()) {
if (!evaluator_->IsRunning())
evaluator_->Start();
evaluator_->SetResidentSetLimitMb(
std::max(pref->GetValue()->GetInt(), kMinimalResidentSetLimitMb));
} else if (evaluator_->IsRunning()) {
evaluator_->Stop();
}
#if !BUILDFLAG(IS_ANDROID)
resource_coordinator::GetTabLifecycleUnitSource()
->SetMemoryLimitEnterprisePolicyFlag(pref->IsManaged());
#endif
}
} // namespace memory
|