diff options
author | reveman@chromium.org <reveman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-08-11 21:09:37 +0000 |
---|---|---|
committer | reveman@chromium.org <reveman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-08-11 21:11:29 +0000 |
commit | f5965a35d658e81d95301b8e96acc07474133031 (patch) | |
tree | d11536a5aca694d6cd36fefca959c1af116c02f8 /content | |
parent | 672c7bf98353a05d54722ab25e6c877ae70c62e3 (diff) | |
download | chromium_src-f5965a35d658e81d95301b8e96acc07474133031.zip chromium_src-f5965a35d658e81d95301b8e96acc07474133031.tar.gz chromium_src-f5965a35d658e81d95301b8e96acc07474133031.tar.bz2 |
base: Introduce an explicit call for reducing emulated discardable memory usage.
This removes the use of memory pressure signals from discardable memory
system and instead introduces an explicit call for reducing emulated
discardable memory that the renderer can call when all widgets are hidden
until we have a better mechanism in place.
BUG=398087
TEST=base_unittests,content_browsertests
Review URL: https://codereview.chromium.org/448173002
Cr-Commit-Position: refs/heads/master@{#288793}
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@288793 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content')
-rw-r--r-- | content/renderer/render_thread_impl.cc | 14 | ||||
-rw-r--r-- | content/renderer/render_thread_impl_browsertest.cc | 52 |
2 files changed, 62 insertions, 4 deletions
diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc index 37fa090..daff6bc 100644 --- a/content/renderer/render_thread_impl.cc +++ b/content/renderer/render_thread_impl.cc @@ -15,6 +15,7 @@ #include "base/lazy_instance.h" #include "base/logging.h" #include "base/memory/discardable_memory.h" +#include "base/memory/discardable_memory_emulated.h" #include "base/memory/shared_memory.h" #include "base/metrics/field_trial.h" #include "base/metrics/histogram.h" @@ -179,6 +180,9 @@ const int kMaxRasterThreads = 64; // allocation that exceeds this limit. const size_t kImageCacheSingleAllocationByteLimit = 64 * 1024 * 1024; +const size_t kEmulatedDiscardableMemoryBytesToKeepWhenWidgetsHidden = + 4 * 1024 * 1024; + // Keep the global RenderThreadImpl in a TLS slot so it is impossible to access // incorrectly from the wrong thread. base::LazyInstance<base::ThreadLocalPointer<RenderThreadImpl> > @@ -545,10 +549,6 @@ void RenderThreadImpl::Init() { base::DiscardableMemory::SetPreferredType(type); - // Allow discardable memory implementations to register memory pressure - // listeners. - base::DiscardableMemory::RegisterMemoryPressureListeners(); - // AllocateGpuMemoryBuffer must be used exclusively on one thread but // it doesn't have to be the same thread RenderThreadImpl is created on. allocate_gpu_memory_buffer_thread_checker_.DetachFromThread(); @@ -1623,6 +1623,12 @@ void RenderThreadImpl::WidgetHidden() { hidden_widget_count_++; if (widget_count_ && hidden_widget_count_ == widget_count_) { + // TODO(reveman): Remove this when we have a better mechanism to prevent + // total discardable memory used by all renderers from growing too large. + base::internal::DiscardableMemoryEmulated:: + ReduceMemoryUsageUntilWithinLimit( + kEmulatedDiscardableMemoryBytesToKeepWhenWidgetsHidden); + if (GetContentClient()->renderer()->RunIdleHandlerWhenWidgetsHidden()) ScheduleIdleHandler(kInitialIdleHandlerDelayMs); } diff --git a/content/renderer/render_thread_impl_browsertest.cc b/content/renderer/render_thread_impl_browsertest.cc index f5a0d1d..55a4379 100644 --- a/content/renderer/render_thread_impl_browsertest.cc +++ b/content/renderer/render_thread_impl_browsertest.cc @@ -3,6 +3,8 @@ // found in the LICENSE file. #include "base/command_line.h" +#include "base/memory/discardable_memory.h" +#include "base/memory/scoped_vector.h" #include "content/public/browser/content_browser_client.h" #include "content/public/common/content_client.h" #include "content/public/common/content_switches.h" @@ -70,5 +72,55 @@ TEST_F(RenderThreadImplBrowserTest, base::Bind(&CheckRenderThreadInputHandlerManager, thread)); } +// Checks that emulated discardable memory is discarded when the last widget +// is hidden. +TEST_F(RenderThreadImplBrowserTest, + EmulatedDiscardableMemoryDiscardedWhenWidgetsHidden) { + ContentClient content_client; + ContentBrowserClient content_browser_client; + ContentRendererClient content_renderer_client; + SetContentClient(&content_client); + SetBrowserClientForTesting(&content_browser_client); + SetRendererClientForTesting(&content_renderer_client); + base::MessageLoopForIO message_loop_; + + std::string channel_id = + IPC::Channel::GenerateVerifiedChannelID(std::string()); + DummyListener dummy_listener; + scoped_ptr<IPC::Channel> channel( + IPC::Channel::CreateServer(channel_id, &dummy_listener)); + ASSERT_TRUE(channel->Connect()); + + scoped_ptr<MockRenderProcess> mock_process(new MockRenderProcess); + // Owned by mock_process. + RenderThreadImpl* thread = new RenderThreadImpl(channel_id); + thread->EnsureWebKitInitialized(); + thread->WidgetCreated(); + + // Allocate 128MB of discardable memory. + ScopedVector<base::DiscardableMemory> discardable_memory; + for (int i = 0; i < 32; ++i) { + discardable_memory.push_back( + base::DiscardableMemory::CreateLockedMemoryWithType( + base::DISCARDABLE_MEMORY_TYPE_EMULATED, 4 * 1024 * 1024).release()); + ASSERT_TRUE(discardable_memory.back()); + discardable_memory.back()->Unlock(); + } + + // Hide all widgets. + thread->WidgetHidden(); + + // Count how much memory is left, should be at most one block. + int blocks_left = 0; + for (auto iter = discardable_memory.begin(); iter != discardable_memory.end(); + ++iter) { + if ((*iter)->Lock() == base::DISCARDABLE_MEMORY_LOCK_STATUS_SUCCESS) + ++blocks_left; + } + EXPECT_LE(blocks_left, 1); + + thread->WidgetDestroyed(); +} + } // namespace } // namespace content |