| Index: content/renderer/render_thread_impl.cc
|
| diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc
|
| index d3ee4b8dce527ffa822c17609e5400d8b4f9489a..9a8c88701959cda2497c037d43a8072e6d5baa62 100644
|
| --- a/content/renderer/render_thread_impl.cc
|
| +++ b/content/renderer/render_thread_impl.cc
|
| @@ -160,7 +160,6 @@
|
| #include "third_party/skia/include/core/SkGraphics.h"
|
| #include "ui/base/layout.h"
|
| #include "ui/base/ui_base_switches.h"
|
| -#include "v8/include/v8.h"
|
|
|
| #if defined(OS_ANDROID)
|
| #include <cpu-features.h>
|
| @@ -355,13 +354,6 @@ void NotifyTimezoneChangeOnThisThread() {
|
| v8::Date::DateTimeConfigurationChangeNotification(isolate);
|
| }
|
|
|
| -void LowMemoryNotificationOnThisThread() {
|
| - v8::Isolate* isolate = v8::Isolate::GetCurrent();
|
| - if (!isolate)
|
| - return;
|
| - isolate->LowMemoryNotification();
|
| -}
|
| -
|
| class RenderFrameSetupImpl : public mojom::RenderFrameSetup {
|
| public:
|
| explicit RenderFrameSetupImpl(
|
| @@ -811,7 +803,9 @@ void RenderThreadImpl::Init(
|
| #endif
|
|
|
| memory_pressure_listener_.reset(new base::MemoryPressureListener(
|
| - base::Bind(&RenderThreadImpl::OnMemoryPressure, base::Unretained(this))));
|
| + base::Bind(&RenderThreadImpl::OnMemoryPressure, base::Unretained(this)),
|
| + base::Bind(&RenderThreadImpl::OnSyncMemoryPressure,
|
| + base::Unretained(this))));
|
|
|
| int num_raster_threads = 0;
|
| std::string string_value =
|
| @@ -2006,6 +2000,7 @@ void RenderThreadImpl::OnCreateNewSharedWorker(
|
|
|
| void RenderThreadImpl::OnMemoryPressure(
|
| base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level) {
|
| + TRACE_EVENT0("memory","RenderThreadImpl::OnMemoryPressure");
|
| ReleaseFreeMemory();
|
|
|
| // Do not call into blink if it is not initialized.
|
| @@ -2013,19 +2008,6 @@ void RenderThreadImpl::OnMemoryPressure(
|
| blink::WebMemoryPressureListener::onMemoryPressure(
|
| static_cast<blink::WebMemoryPressureLevel>(memory_pressure_level));
|
|
|
| - if (blink::mainThreadIsolate()) {
|
| - // Trigger full v8 garbage collection on memory pressure notifications.
|
| - // This will potentially hang the renderer for a long time, however, when
|
| - // we receive a memory pressure notification, we might be about to be
|
| - // killed. Because of the janky hang don't do this to foreground
|
| - // renderers.
|
| - if (RendererIsHidden()) {
|
| - blink::mainThreadIsolate()->LowMemoryNotification();
|
| - RenderThread::Get()->PostTaskToAllWebWorkers(
|
| - base::Bind(&LowMemoryNotificationOnThisThread));
|
| - }
|
| - }
|
| -
|
| if (memory_pressure_level ==
|
| base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL) {
|
| // Purge Skia font cache, by setting it to 0 and then again to the
|
| @@ -2180,4 +2162,45 @@ void RenderThreadImpl::PendingRenderFrameConnect::OnConnectionError() {
|
| DCHECK_EQ(1u, erased);
|
| }
|
|
|
| +void RenderThreadImpl::OnSyncMemoryPressure(
|
| + base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level) {
|
| + if (blink::mainThreadIsolate()) {
|
| + static_assert(
|
| + static_cast<v8::MemoryPressureLevel>(
|
| + base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE) ==
|
| + v8::MemoryPressureLevel::kNone, "none level not align");
|
| + static_assert(
|
| + static_cast<v8::MemoryPressureLevel>(
|
| + base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE) ==
|
| + v8::MemoryPressureLevel::kModerate, "moderate level not align");
|
| + static_assert(
|
| + static_cast<v8::MemoryPressureLevel>(
|
| + base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL) ==
|
| + v8::MemoryPressureLevel::kCritical, "critical level not align");
|
| +
|
| + v8::MemoryPressureLevel v8_memory_pressure_level =
|
| + static_cast<v8::MemoryPressureLevel>(memory_pressure_level);
|
| +
|
| + if (!RendererIsHidden()) {
|
| + if (v8_memory_pressure_level == v8::MemoryPressureLevel::kCritical)
|
| + // In order to reduce performance impact, translate critical level to
|
| + // moderate level for foregroud renderer.
|
| + v8_memory_pressure_level = v8::MemoryPressureLevel::kModerate;
|
| + }
|
| +
|
| + blink::mainThreadIsolate()->MemoryPressureNotification(
|
| + v8_memory_pressure_level);
|
| + std::set<v8::Isolate*>* worker_thread_isolates =
|
| + blink::workerThreadIsolates();
|
| + if (worker_thread_isolates) {
|
| + for (std::set<v8::Isolate*>::iterator it =
|
| + worker_thread_isolates->begin();
|
| + it != worker_thread_isolates->end(); ++it) {
|
| + v8::Isolate* isolate = *it;
|
| + isolate->MemoryPressureNotification(v8_memory_pressure_level);
|
| + }
|
| + }
|
| + }
|
| +}
|
| +
|
| } // namespace content
|
|
|