Index: android_webview/browser/gl_view_renderer_manager.cc |
diff --git a/android_webview/browser/gl_view_renderer_manager.cc b/android_webview/browser/gl_view_renderer_manager.cc |
index 13a60fd1fab82d98e6624acadfb54666125c6e7b..b529a301a2e238b7cee13b4cf0780636c5d25686 100644 |
--- a/android_webview/browser/gl_view_renderer_manager.cc |
+++ b/android_webview/browser/gl_view_renderer_manager.cc |
@@ -67,4 +67,32 @@ GLViewRendererManager::GetMostRecentlyDrawn() const { |
return *mru_list_.begin(); |
} |
+MemoryPolicy GLViewRendererManager::EvictUntilSatisfied( |
+ MemoryPolicy desired_policy, Key key) { |
+ AutoLock auto_lock(lock_); |
+ |
+ MemoryPolicy zero_policy; |
+ size_t evicted_memory = 0, evicted_resources = 0; |
+ ListType::reverse_iterator it; |
+ |
+ // Evicts from the least recent drawn view, until the disired amount of memory |
+ // can be reclaimed. |
+ for (it = mru_list_.rbegin(); it != mru_list_.rend(); it++) { |
+ // key represents the view that requested the eviction, so we don't need to |
+ // evict the requester itself. |
+ if (*it == *key) |
+ continue; |
+ MemoryPolicy policy = (*it)->GetCompositor()->GetMemoryPolicy(); |
+ evicted_memory += policy.bytes_limit; |
+ evicted_resources += policy.num_resources_limit; |
+ |
+ (*it)->GetCompositor()->SetMemoryPolicy(zero_policy); |
+ if (evicted_memory >= desired_policy.bytes_limit && |
+ evicted_resources >= desired_policy.num_resources_limit) { |
+ break; |
+ } |
+ } |
+ return MemoryPolicy(evicted_memory, evicted_resources); |
+} |
+ |
} // namespace android_webview |