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

Unified Diff: cc/prioritized_resource_manager.cc

Issue 11411251: Use a lock to deal with concurrent access to the m_evictedBackings (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Make lock mutable Created 8 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/prioritized_resource_manager.h ('k') | cc/prioritized_resource_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/prioritized_resource_manager.cc
diff --git a/cc/prioritized_resource_manager.cc b/cc/prioritized_resource_manager.cc
index c22df167ccf886653cd77e5f6762ff48010f93d0..42a1682eae9a6dc0465f0b1676d585a9a54fd520 100644
--- a/cc/prioritized_resource_manager.cc
+++ b/cc/prioritized_resource_manager.cc
@@ -36,7 +36,7 @@ PrioritizedResourceManager::~PrioritizedResourceManager()
while (m_textures.size() > 0)
unregisterTexture(*m_textures.begin());
- deleteAllEvictedBackings();
+ unlinkAndClearEvictedBackings();
DCHECK(m_evictedBackings.empty());
// Each remaining backing is a leaked opengl texture. There should be none.
@@ -306,15 +306,6 @@ void PrioritizedResourceManager::reduceMemory(ResourceProvider* resourceProvider
EvictOnlyRecyclable,
UnlinkBackings,
resourceProvider);
-
- // Unlink all evicted backings
- for (BackingList::const_iterator it = m_evictedBackings.begin(); it != m_evictedBackings.end(); ++it) {
- if ((*it)->owner())
- (*it)->owner()->unlink();
- }
-
- // And clear the list of evicted backings
- deleteAllEvictedBackings();
}
void PrioritizedResourceManager::clearAllMemory(ResourceProvider* resourceProvider)
@@ -343,39 +334,14 @@ bool PrioritizedResourceManager::reduceMemoryOnImplThread(size_t limitBytes, int
resourceProvider);
}
-void PrioritizedResourceManager::getEvictedBackings(BackingList& evictedBackings)
-{
- DCHECK(m_proxy->isImplThread());
- evictedBackings.clear();
- evictedBackings.insert(evictedBackings.begin(), m_evictedBackings.begin(), m_evictedBackings.end());
- for (BackingList::const_iterator it = evictedBackings.begin(); it != evictedBackings.end(); ++it) {
- PrioritizedResource::Backing* backing = (*it);
- CHECK(!backing->m_inMainThreadEvictedList);
- backing->m_inMainThreadEvictedList = true;
- }
-}
-
-void PrioritizedResourceManager::unlinkEvictedBackings(const BackingList& evictedBackings)
+void PrioritizedResourceManager::unlinkAndClearEvictedBackings()
{
DCHECK(m_proxy->isMainThread());
- for (BackingList::const_iterator it = evictedBackings.begin(); it != evictedBackings.end(); ++it) {
- PrioritizedResource::Backing* backing = (*it);
- CHECK(backing->m_inMainThreadEvictedList);
- backing->m_inMainThreadEvictedList = false;
- if (backing->owner()) {
- CHECK(backing->owner()->backing());
- CHECK(backing->owner()->backing() == backing);
- backing->owner()->unlink();
- }
- }
-}
-
-void PrioritizedResourceManager::deleteAllEvictedBackings()
-{
- DCHECK(m_proxy->isMainThread() || (m_proxy->isImplThread() && m_proxy->isMainThreadBlocked()));
+ base::AutoLock scoped_lock(m_evictedBackingsLock);
for (BackingList::const_iterator it = m_evictedBackings.begin(); it != m_evictedBackings.end(); ++it) {
PrioritizedResource::Backing* backing = (*it);
- CHECK(!backing->owner());
+ if (backing->owner())
+ backing->owner()->unlink();
delete backing;
}
m_evictedBackings.clear();
@@ -383,6 +349,8 @@ void PrioritizedResourceManager::deleteAllEvictedBackings()
bool PrioritizedResourceManager::linkedEvictedBackingsExist() const
{
+ DCHECK(m_proxy->isImplThread() && m_proxy->isMainThreadBlocked());
+ base::AutoLock scoped_lock(m_evictedBackingsLock);
for (BackingList::const_iterator it = m_evictedBackings.begin(); it != m_evictedBackings.end(); ++it) {
if ((*it)->owner())
return true;
@@ -446,6 +414,7 @@ void PrioritizedResourceManager::evictFirstBackingResource(ResourceProvider* res
backing->deleteResource(resourceProvider);
m_memoryUseBytes -= backing->bytes();
m_backings.pop_front();
+ base::AutoLock scoped_lock(m_evictedBackingsLock);
m_evictedBackings.push_back(backing);
}
@@ -468,6 +437,7 @@ void PrioritizedResourceManager::assertInvariants()
for (TextureSet::iterator it = m_textures.begin(); it != m_textures.end(); ++it) {
PrioritizedResource* texture = (*it);
PrioritizedResource::Backing* backing = texture->backing();
+ base::AutoLock scoped_lock(m_evictedBackingsLock);
if (backing) {
if (backing->resourceHasBeenDeleted()) {
DCHECK(std::find(m_backings.begin(), m_backings.end(), backing) == m_backings.end());
« no previous file with comments | « cc/prioritized_resource_manager.h ('k') | cc/prioritized_resource_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698