| 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
|
|
|