1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "content/browser/renderer_host/renderer_frame_manager.h"
9 #include "base/logging.h"
10 #include "base/sys_info.h"
14 RendererFrameManager* RendererFrameManager::GetInstance() {
15 return Singleton<RendererFrameManager>::get();
18 void RendererFrameManager::AddFrame(RendererFrameManagerClient* frame,
22 locked_frames_[frame] = 1;
24 unlocked_frames_.push_front(frame);
28 void RendererFrameManager::RemoveFrame(RendererFrameManagerClient* frame) {
29 std::map<RendererFrameManagerClient*, size_t>::iterator locked_iter =
30 locked_frames_.find(frame);
31 if (locked_iter != locked_frames_.end())
32 locked_frames_.erase(locked_iter);
33 unlocked_frames_.remove(frame);
36 void RendererFrameManager::LockFrame(RendererFrameManagerClient* frame) {
37 std::list<RendererFrameManagerClient*>::iterator unlocked_iter =
38 std::find(unlocked_frames_.begin(), unlocked_frames_.end(), frame);
39 if (unlocked_iter != unlocked_frames_.end()) {
40 DCHECK(locked_frames_.find(frame) == locked_frames_.end());
41 unlocked_frames_.remove(frame);
42 locked_frames_[frame] = 1;
44 DCHECK(locked_frames_.find(frame) != locked_frames_.end());
45 locked_frames_[frame]++;
49 void RendererFrameManager::UnlockFrame(RendererFrameManagerClient* frame) {
50 DCHECK(locked_frames_.find(frame) != locked_frames_.end());
51 size_t locked_count = locked_frames_[frame];
53 if (locked_count > 1) {
54 locked_frames_[frame]--;
57 unlocked_frames_.push_front(frame);
62 RendererFrameManager::RendererFrameManager() {
63 max_number_of_saved_frames_ =
64 #if defined(OS_ANDROID)
67 std::min(5, 2 + (base::SysInfo::AmountOfPhysicalMemoryMB() / 256));
71 RendererFrameManager::~RendererFrameManager() {}
73 void RendererFrameManager::CullUnlockedFrames() {
74 while (!unlocked_frames_.empty() &&
75 unlocked_frames_.size() + locked_frames_.size() >
76 max_number_of_saved_frames()) {
77 size_t old_size = unlocked_frames_.size();
78 // Should remove self from list.
79 unlocked_frames_.back()->EvictCurrentFrame();
80 DCHECK_EQ(unlocked_frames_.size() + 1, old_size);
84 } // namespace content