Commit fd33b59f authored by vollick@chromium.org's avatar vollick@chromium.org

Apply artificial memory pressure when backgrounded.

In https://codereview.chromium.org/17106004/, I am adding discardable memory
emulation for platforms that do not support it natively. The emulation works by
listening for memory pressure notifications and purging memory in response.
But we don't yet provide memory pressure notifications on any platform other
than android.

In future, we'll periodically poll system memory usage, and send memory pressure
notifications as appropriate, but as a first step, we will artificially apply
memory pressure when tabs are backgrounded.

BUG=237681

Review URL: https://chromiumcodereview.appspot.com/17355004

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@207947 0039d316-1c4b-4281-b951-d872f2087c98
parent a14ddcdd
......@@ -278,6 +278,8 @@
'renderer/render_process.h',
'renderer/render_process_impl.cc',
'renderer/render_process_impl.h',
'renderer/render_process_visibility_manager.cc',
'renderer/render_process_visibility_manager.h',
'renderer/render_thread_impl.cc',
'renderer/render_thread_impl.h',
'renderer/render_view_impl.cc',
......
// Copyright 2013 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 "content/renderer/render_process_visibility_manager.h"
#include "base/logging.h"
#include "base/memory/memory_pressure_listener.h"
namespace content {
RenderProcessVisibilityManager::RenderProcessVisibilityManager()
: num_visible_render_widgets_(0) {
}
RenderProcessVisibilityManager::~RenderProcessVisibilityManager() {
}
// static
RenderProcessVisibilityManager* RenderProcessVisibilityManager::GetInstance() {
return Singleton<RenderProcessVisibilityManager>::get();
}
void RenderProcessVisibilityManager::WidgetVisibilityChanged(bool visible) {
#if !defined(DISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY)
num_visible_render_widgets_ += visible ? 1 : -1;
DCHECK_LE(0, num_visible_render_widgets_);
if (num_visible_render_widgets_ == 0) {
// TODO(vollick): Remove this this heavy-handed approach once we're polling
// the real system memory pressure.
base::MemoryPressureListener::NotifyMemoryPressure(
base::MemoryPressureListener::MEMORY_PRESSURE_CRITICAL);
}
#endif
}
} // namespace content
// Copyright 2013 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.
#ifndef CONTENT_RENDERER_RENDER_PROCESS_VISIBILITY_MANAGER_H_
#define CONTENT_RENDERER_RENDER_PROCESS_VISIBILITY_MANAGER_H_
#include "base/memory/singleton.h"
#include "content/common/content_export.h"
namespace content {
class CONTENT_EXPORT RenderProcessVisibilityManager {
public:
static RenderProcessVisibilityManager* GetInstance();
void WidgetVisibilityChanged(bool visible);
private:
friend struct DefaultSingletonTraits<RenderProcessVisibilityManager>;
RenderProcessVisibilityManager();
~RenderProcessVisibilityManager();
int num_visible_render_widgets_;
DISALLOW_COPY_AND_ASSIGN(RenderProcessVisibilityManager);
};
} // namespace content
#endif // CONTENT_RENDERER_RENDER_PROCESS_VISIBILITY_MANAGER_H_
......@@ -14,6 +14,7 @@
#include "base/debug/trace_event.h"
#include "base/lazy_instance.h"
#include "base/logging.h"
#include "base/memory/discardable_memory.h"
#include "base/metrics/field_trial.h"
#include "base/metrics/histogram.h"
#include "base/metrics/stats_table.h"
......@@ -71,6 +72,7 @@
#include "content/renderer/p2p/socket_dispatcher.h"
#include "content/renderer/plugin_channel_host.h"
#include "content/renderer/render_process_impl.h"
#include "content/renderer/render_process_visibility_manager.h"
#include "content/renderer/render_view_impl.h"
#include "content/renderer/renderer_webkitplatformsupport_impl.h"
#include "content/renderer/skia_benchmarking_extension.h"
......@@ -597,6 +599,10 @@ void RenderThreadImpl::WidgetHidden() {
DCHECK(hidden_widget_count_ < widget_count_);
hidden_widget_count_++;
RenderProcessVisibilityManager* manager =
RenderProcessVisibilityManager::GetInstance();
manager->WidgetVisibilityChanged(false);
if (!GetContentClient()->renderer()->RunIdleHandlerWhenWidgetsHidden()) {
return;
}
......@@ -608,6 +614,11 @@ void RenderThreadImpl::WidgetHidden() {
void RenderThreadImpl::WidgetRestored() {
DCHECK_GT(hidden_widget_count_, 0);
hidden_widget_count_--;
RenderProcessVisibilityManager* manager =
RenderProcessVisibilityManager::GetInstance();
manager->WidgetVisibilityChanged(true);
if (!GetContentClient()->renderer()->RunIdleHandlerWhenWidgetsHidden()) {
return;
}
......
......@@ -30,6 +30,7 @@
#include "content/renderer/gpu/render_widget_compositor.h"
#include "content/renderer/ime_event_guard.h"
#include "content/renderer/render_process.h"
#include "content/renderer/render_process_visibility_manager.h"
#include "content/renderer/render_thread_impl.h"
#include "content/renderer/renderer_webkitplatformsupport_impl.h"
#include "ipc/ipc_sync_message.h"
......@@ -188,6 +189,8 @@ RenderWidget::RenderWidget(WebKit::WebPopupType popup_type,
is_threaded_compositing_enabled_ =
CommandLine::ForCurrentProcess()->HasSwitch(
switches::kEnableThreadedCompositing);
RenderProcessVisibilityManager::GetInstance()->WidgetVisibilityChanged(true);
}
RenderWidget::~RenderWidget() {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment