blob: a8c9f6c73eec01511dbe5708550b7f5ddaa3ff54 [file] [log] [blame]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "third_party/blink/renderer/controller/memory_saver_controller.h"
#include "base/system/sys_info.h"
#include "third_party/blink/public/common/features.h"
#include "third_party/blink/renderer/core/workers/worker_backing_thread.h"
#include "third_party/blink/renderer/platform/scheduler/public/main_thread.h"
#include "third_party/blink/renderer/platform/scheduler/public/main_thread_scheduler.h"
#include "third_party/blink/renderer/platform/scheduler/public/thread.h"
#include "third_party/blink/renderer/platform/scheduler/public/thread_scheduler.h"
#include "third_party/blink/renderer/platform/wtf/functional.h"
namespace blink {
void MemorySaverController::Initialize() {
DEFINE_STATIC_LOCAL(MemorySaverController, controller, ());
(void)controller;
}
MemorySaverController::MemorySaverController() {
MainThreadScheduler* scheduler =
Thread::MainThread()->Scheduler()->ToMainThreadScheduler();
DCHECK(scheduler);
sample_timer_.SetTaskRunner(scheduler->NonWakingTaskRunner());
if (base::SysInfo::AmountOfPhysicalMemory() >= base::MiB(4000)) {
return;
}
if (base::FeatureList::IsEnabled(features::kMemorySaverModeRenderTuning)) {
sample_timer_.Start(FROM_HERE, base::Seconds(5), this,
&MemorySaverController::Sample);
}
}
void MemorySaverController::Sample() {
base::ByteCount available_ram =
base::SysInfo::AmountOfAvailablePhysicalMemory();
if (available_ram.InMiB() <
features::kAvailableMemoryThresholdParamMb.Get()) {
if (!memory_saver_enabled_) {
SetMemorySaverModeForAllIsolates(true);
memory_saver_enabled_ = true;
}
} else if (memory_saver_enabled_) {
SetMemorySaverModeForAllIsolates(false);
memory_saver_enabled_ = false;
}
}
void MemorySaverController::SetMemorySaverModeForAllIsolates(
bool memory_saver_mode_enabled) {
Thread::MainThread()
->Scheduler()
->ToMainThreadScheduler()
->ForEachMainThreadIsolate([&](v8::Isolate* isolate) {
isolate->SetMemorySaverMode(memory_saver_mode_enabled);
});
WorkerBackingThread::SetMemorySaverModeForWorkerThreadIsolates(
memory_saver_mode_enabled);
}
} // namespace blink