15c9814d61075f032ec5d3196f6eec2071c573d5
[platform/framework/web/crosswalk.git] / src / content / browser / renderer_host / renderer_frame_manager.cc
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.
4
5 #include "content/browser/renderer_host/renderer_frame_manager.h"
6
7 #include <algorithm>
8
9 #include "base/logging.h"
10 #include "base/sys_info.h"
11
12 namespace content {
13
14 RendererFrameManager* RendererFrameManager::GetInstance() {
15   return Singleton<RendererFrameManager>::get();
16 }
17
18 void RendererFrameManager::AddFrame(RendererFrameManagerClient* frame,
19                                     bool locked) {
20   RemoveFrame(frame);
21   if (locked)
22     locked_frames_[frame] = 1;
23   else
24     unlocked_frames_.push_front(frame);
25   CullUnlockedFrames();
26 }
27
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);
34 }
35
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;
43   } else {
44     DCHECK(locked_frames_.find(frame) != locked_frames_.end());
45     locked_frames_[frame]++;
46   }
47 }
48
49 void RendererFrameManager::UnlockFrame(RendererFrameManagerClient* frame) {
50   DCHECK(locked_frames_.find(frame) != locked_frames_.end());
51   size_t locked_count = locked_frames_[frame];
52   DCHECK(locked_count);
53   if (locked_count > 1) {
54     locked_frames_[frame]--;
55   } else {
56     RemoveFrame(frame);
57     unlocked_frames_.push_front(frame);
58     CullUnlockedFrames();
59   }
60 }
61
62 RendererFrameManager::RendererFrameManager() {
63   max_number_of_saved_frames_ =
64 #if defined(OS_ANDROID)
65       1;
66 #else
67       std::min(5, 2 + (base::SysInfo::AmountOfPhysicalMemoryMB() / 256));
68 #endif
69 }
70
71 RendererFrameManager::~RendererFrameManager() {}
72
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);
81   }
82 }
83
84 }  // namespace content