Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(59)

Side by Side Diff: content/browser/renderer_host/renderer_frame_manager.cc

Issue 174323003: Expose locks for CopyFromCompositingSurface/CopyFromBackingStore API (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: added android-side change Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/renderer_host/renderer_frame_manager.h" 5 #include "content/browser/renderer_host/renderer_frame_manager.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/sys_info.h" 10 #include "base/sys_info.h"
11 11
12 namespace content { 12 namespace content {
13 13
14 RendererFrameManager* RendererFrameManager::GetInstance() { 14 RendererFrameManager* RendererFrameManager::GetInstance() {
15 return Singleton<RendererFrameManager>::get(); 15 return Singleton<RendererFrameManager>::get();
16 } 16 }
17 17
18 void RendererFrameManager::AddFrame(RendererFrameManagerClient* frame, 18 void RendererFrameManager::AddFrame(RendererFrameManagerClient* frame,
19 bool locked) { 19 bool locked) {
20 RemoveFrame(frame); 20 RemoveFrame(frame);
21 if (locked) 21 if (locked)
22 locked_frames_[frame] = 1; 22 locked_frames_[frame] = 1;
23 else 23 else
24 unlocked_frames_.push_front(frame); 24 unlocked_frames_.push_front(frame);
25 CullUnlockedFrames(); 25 CullUnlockedFrames();
26 } 26 }
27 27
28 void RendererFrameManager::RemoveFrame(RendererFrameManagerClient* frame) { 28 void RendererFrameManager::RemoveFrame(RendererFrameManagerClient* frame) {
29 std::map<RendererFrameManagerClient*, size_t>::iterator locked_iter = 29 LockedFrameCount::iterator locked_iter = locked_frames_.find(frame);
30 locked_frames_.find(frame);
31 if (locked_iter != locked_frames_.end()) 30 if (locked_iter != locked_frames_.end())
32 locked_frames_.erase(locked_iter); 31 locked_frames_.erase(locked_iter);
33 unlocked_frames_.remove(frame); 32 unlocked_frames_.remove(frame);
34 } 33 }
35 34
36 void RendererFrameManager::LockFrame(RendererFrameManagerClient* frame) { 35 void RendererFrameManager::LockFrame(RendererFrameManagerClient* frame) {
37 std::list<RendererFrameManagerClient*>::iterator unlocked_iter = 36 UnlockedFrames::iterator unlocked_iter =
38 std::find(unlocked_frames_.begin(), unlocked_frames_.end(), frame); 37 std::find(unlocked_frames_.begin(), unlocked_frames_.end(), frame);
39 if (unlocked_iter != unlocked_frames_.end()) { 38 if (unlocked_iter != unlocked_frames_.end()) {
40 DCHECK(locked_frames_.find(frame) == locked_frames_.end()); 39 DCHECK(locked_frames_.find(frame) == locked_frames_.end());
41 unlocked_frames_.remove(frame); 40 unlocked_frames_.remove(frame);
42 locked_frames_[frame] = 1; 41 locked_frames_[frame] = 1;
43 } else { 42 } else {
44 DCHECK(locked_frames_.find(frame) != locked_frames_.end()); 43 DCHECK(locked_frames_.find(frame) != locked_frames_.end());
45 locked_frames_[frame]++; 44 locked_frames_[frame]++;
46 } 45 }
47 } 46 }
48 47
49 void RendererFrameManager::UnlockFrame(RendererFrameManagerClient* frame) { 48 void RendererFrameManager::UnlockFrame(RendererFrameManagerClient* frame) {
50 DCHECK(locked_frames_.find(frame) != locked_frames_.end()); 49 DCHECK(locked_frames_.find(frame) != locked_frames_.end());
51 size_t locked_count = locked_frames_[frame]; 50 size_t locked_count = locked_frames_[frame];
52 DCHECK(locked_count); 51 DCHECK(locked_count);
53 if (locked_count > 1) { 52 if (locked_count > 1) {
54 locked_frames_[frame]--; 53 locked_frames_[frame]--;
55 } else { 54 } else {
56 RemoveFrame(frame); 55 RemoveFrame(frame);
57 unlocked_frames_.push_front(frame); 56 unlocked_frames_.push_front(frame);
58 CullUnlockedFrames(); 57 CullUnlockedFrames();
59 } 58 }
60 } 59 }
61 60
61 size_t RendererFrameManager::LockedCount(RendererFrameManagerClient* frame) {
62 LockedFrameCount::iterator iter = locked_frames_.find(frame);
63 if (iter != locked_frames_.end())
64 return iter->second;
65 return 0;
66 }
67
62 RendererFrameManager::RendererFrameManager() { 68 RendererFrameManager::RendererFrameManager() {
63 max_number_of_saved_frames_ = 69 max_number_of_saved_frames_ =
64 #if defined(OS_ANDROID) 70 #if defined(OS_ANDROID)
65 1; 71 1;
66 #else 72 #else
67 std::min(5, 2 + (base::SysInfo::AmountOfPhysicalMemoryMB() / 256)); 73 std::min(5, 2 + (base::SysInfo::AmountOfPhysicalMemoryMB() / 256));
68 #endif 74 #endif
69 } 75 }
70 76
71 RendererFrameManager::~RendererFrameManager() {} 77 RendererFrameManager::~RendererFrameManager() {}
72 78
73 void RendererFrameManager::CullUnlockedFrames() { 79 void RendererFrameManager::CullUnlockedFrames() {
74 while (!unlocked_frames_.empty() && 80 while (!unlocked_frames_.empty() &&
75 unlocked_frames_.size() + locked_frames_.size() > 81 unlocked_frames_.size() + locked_frames_.size() >
76 max_number_of_saved_frames()) { 82 max_number_of_saved_frames()) {
77 size_t old_size = unlocked_frames_.size(); 83 size_t old_size = unlocked_frames_.size();
78 // Should remove self from list. 84 // Should remove self from list.
79 unlocked_frames_.back()->EvictCurrentFrame(); 85 unlocked_frames_.back()->EvictCurrentFrame();
80 DCHECK_EQ(unlocked_frames_.size() + 1, old_size); 86 DCHECK_EQ(unlocked_frames_.size() + 1, old_size);
81 } 87 }
82 } 88 }
83 89
84 } // namespace content 90 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698