diff options
Diffstat (limited to 'content/browser/renderer_host/renderer_frame_manager.cc')
-rw-r--r-- | content/browser/renderer_host/renderer_frame_manager.cc | 18 |
1 files changed, 16 insertions, 2 deletions
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 <algorithm> #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<int>(std::min(static_cast<float>(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(); |