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

Unified Diff: cc/resources/resource_pool.cc

Issue 1420433009: cc: Keep most recently used resources at the front of resource queue. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Changed order of mru <-> lru. Created 5 years, 1 month 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/resources/resource_pool.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/resources/resource_pool.cc
diff --git a/cc/resources/resource_pool.cc b/cc/resources/resource_pool.cc
index 835c37d6c32d9f23029bcfea419ad6f8f2b3f2fc..402ebbf1b9204d566f0d39d1633c8d2dad70b1a1 100644
--- a/cc/resources/resource_pool.cc
+++ b/cc/resources/resource_pool.cc
@@ -79,7 +79,7 @@ ResourcePool::~ResourcePool() {
DCHECK_EQ(0u, in_use_resources_.size());
while (!busy_resources_.empty()) {
- DidFinishUsingResource(busy_resources_.take_front());
+ DidFinishUsingResource(busy_resources_.take_back());
}
SetResourceUsageLimits(0, 0);
@@ -91,6 +91,9 @@ ResourcePool::~ResourcePool() {
Resource* ResourcePool::AcquireResource(const gfx::Size& size,
ResourceFormat format) {
+ // Finding resources in |unused_resources_| from MRU to LRU direction, touches
+ // LRU resources only if needed, which inreases possibility of expiring more
+ // LRU resources within kResourceExpirationDelayMs.
for (ResourceDeque::iterator it = unused_resources_.begin();
it != unused_resources_.end(); ++it) {
ScopedResource* resource = *it;
@@ -156,7 +159,7 @@ void ResourcePool::ReleaseResource(Resource* resource, uint64_t content_id) {
pool_resource->set_last_usage(base::TimeTicks::Now());
// Transfer resource to |busy_resources_|.
- busy_resources_.push_back(in_use_resources_.take_and_erase(it));
+ busy_resources_.push_front(in_use_resources_.take_and_erase(it));
in_use_memory_usage_bytes_ -= ResourceUtil::UncheckedSizeInBytes<size_t>(
pool_resource->size(), pool_resource->format());
@@ -185,7 +188,7 @@ void ResourcePool::ReduceResourceUsage() {
// can't be locked for write might also not be truly free-able.
// We can free the resource here but it doesn't mean that the
// memory is necessarily returned to the OS.
- DeleteResource(unused_resources_.take_front());
+ DeleteResource(unused_resources_.take_back());
}
}
@@ -221,7 +224,7 @@ void ResourcePool::CheckBusyResources() {
}
void ResourcePool::DidFinishUsingResource(scoped_ptr<PoolResource> resource) {
- unused_resources_.push_back(resource.Pass());
+ unused_resources_.push_front(resource.Pass());
}
void ResourcePool::ScheduleEvictExpiredResourcesIn(
@@ -260,10 +263,10 @@ void ResourcePool::EvictResourcesNotUsedSince(base::TimeTicks time_limit) {
// as this may not exactly line up with the time a resource became non-busy.
// However, this should be roughly ordered, and will only introduce slight
// delays in freeing expired resources.
- if (unused_resources_.front()->last_usage() > time_limit)
+ if (unused_resources_.back()->last_usage() > time_limit)
return;
- DeleteResource(unused_resources_.take_front());
+ DeleteResource(unused_resources_.take_back());
}
// Also free busy resources older than the delay. With a sufficiently large
@@ -271,21 +274,21 @@ void ResourcePool::EvictResourcesNotUsedSince(base::TimeTicks time_limit) {
// expired are not likely to be busy. Additionally, freeing a "busy" resource
// has no downside other than incorrect accounting.
while (!busy_resources_.empty()) {
- if (busy_resources_.front()->last_usage() > time_limit)
+ if (busy_resources_.back()->last_usage() > time_limit)
return;
- DeleteResource(busy_resources_.take_front());
+ DeleteResource(busy_resources_.take_back());
}
}
base::TimeTicks ResourcePool::GetUsageTimeForLRUResource() const {
if (!unused_resources_.empty()) {
- return unused_resources_.front()->last_usage();
+ return unused_resources_.back()->last_usage();
}
// This is only called when we have at least one evictable resource.
DCHECK(!busy_resources_.empty());
- return busy_resources_.front()->last_usage();
+ return busy_resources_.back()->last_usage();
}
bool ResourcePool::OnMemoryDump(const base::trace_event::MemoryDumpArgs& args,
« no previous file with comments | « cc/resources/resource_pool.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698