From 2e8ac3a3d7bff018f9c47e03bd74fb3212f75392 Mon Sep 17 00:00:00 2001 From: "jbauman@chromium.org" Date: Sat, 26 Apr 2014 22:17:51 +0000 Subject: Limit renderer saved frames to avoid running out of fds. Software delegated rendering uses one fd per tile, so with a bunch of tiles that means it can run out of fds. If it seems close to hitting the limit the browser should throw away old frames to avoid this from happening. BUG=362603 Review URL: https://codereview.chromium.org/248193003 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@266383 0039d316-1c4b-4281-b951-d872f2087c98 --- .../browser/renderer_host/renderer_frame_manager.cc | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) (limited to 'content/browser/renderer_host/renderer_frame_manager.cc') diff --git a/content/browser/renderer_host/renderer_frame_manager.cc b/content/browser/renderer_host/renderer_frame_manager.cc index 15c9814..0a93e298 100644 --- a/content/browser/renderer_host/renderer_frame_manager.cc +++ b/content/browser/renderer_host/renderer_frame_manager.cc @@ -7,7 +7,9 @@ #include #include "base/logging.h" +#include "base/memory/shared_memory.h" #include "base/sys_info.h" +#include "content/common/host_shared_bitmap_manager.h" namespace content { @@ -66,14 +68,26 @@ RendererFrameManager::RendererFrameManager() { #else std::min(5, 2 + (base::SysInfo::AmountOfPhysicalMemoryMB() / 256)); #endif + max_handles_ = base::SharedMemory::GetHandleLimit() / 8.0f; } RendererFrameManager::~RendererFrameManager() {} void RendererFrameManager::CullUnlockedFrames() { + uint32 saved_frame_limit = max_number_of_saved_frames(); + + if (unlocked_frames_.size() + locked_frames_.size() > 0) { + float handles_per_frame = + HostSharedBitmapManager::current()->AllocatedBitmapCount() * 1.0f / + (unlocked_frames_.size() + locked_frames_.size()); + + saved_frame_limit = std::max( + 1, + static_cast(std::min(static_cast(saved_frame_limit), + max_handles_ / handles_per_frame))); + } while (!unlocked_frames_.empty() && - unlocked_frames_.size() + locked_frames_.size() > - max_number_of_saved_frames()) { + unlocked_frames_.size() + locked_frames_.size() > saved_frame_limit) { size_t old_size = unlocked_frames_.size(); // Should remove self from list. unlocked_frames_.back()->EvictCurrentFrame(); -- cgit v1.1