| Index: cc/prioritized_texture_manager.cc | 
| diff --git a/cc/prioritized_texture_manager.cc b/cc/prioritized_texture_manager.cc | 
| index 19aa739efab0a3df9a4c78076aeec2e55b234560..7069a4b2d37a7dcdacc6d99855b240a2bf98712a 100644 | 
| --- a/cc/prioritized_texture_manager.cc | 
| +++ b/cc/prioritized_texture_manager.cc | 
| @@ -37,7 +37,7 @@ PrioritizedTextureManager::~PrioritizedTextureManager() | 
| while (m_textures.size() > 0) | 
| unregisterTexture(*m_textures.begin()); | 
|  | 
| -    deleteUnlinkedEvictedBackings(); | 
| +    unlinkAndClearEvictedBackings(); | 
| DCHECK(m_evictedBackings.empty()); | 
|  | 
| // Each remaining backing is a leaked opengl texture. There should be none. | 
| @@ -308,15 +308,6 @@ void PrioritizedTextureManager::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 | 
| -    deleteUnlinkedEvictedBackings(); | 
| } | 
|  | 
| void PrioritizedTextureManager::clearAllMemory(ResourceProvider* resourceProvider) | 
| @@ -345,39 +336,23 @@ bool PrioritizedTextureManager::reduceMemoryOnImplThread(size_t limitBytes, int | 
| resourceProvider); | 
| } | 
|  | 
| -void PrioritizedTextureManager::getEvictedBackings(BackingList& evictedBackings) | 
| -{ | 
| -    DCHECK(Proxy::isImplThread()); | 
| -    evictedBackings.clear(); | 
| -    evictedBackings.insert(evictedBackings.begin(), m_evictedBackings.begin(), m_evictedBackings.end()); | 
| -} | 
| - | 
| -void PrioritizedTextureManager::unlinkEvictedBackings(const BackingList& evictedBackings) | 
| +void PrioritizedTextureManager::unlinkAndClearEvictedBackings() | 
| { | 
| DCHECK(Proxy::isMainThread()); | 
| -    for (BackingList::const_iterator it = evictedBackings.begin(); it != evictedBackings.end(); ++it) { | 
| -        PrioritizedTexture::Backing* backing = (*it); | 
| -        if (backing->owner()) | 
| -            backing->owner()->unlink(); | 
| -    } | 
| -} | 
| - | 
| -void PrioritizedTextureManager::deleteUnlinkedEvictedBackings() | 
| -{ | 
| -    DCHECK(Proxy::isMainThread() || (Proxy::isImplThread() && Proxy::isMainThreadBlocked())); | 
| -    BackingList newEvictedBackings; | 
| +    base::AutoLock scoped_lock(m_evictedBackingsLock); | 
| for (BackingList::const_iterator it = m_evictedBackings.begin(); it != m_evictedBackings.end(); ++it) { | 
| PrioritizedTexture::Backing* backing = (*it); | 
| if (backing->owner()) | 
| -            newEvictedBackings.push_back(backing); | 
| -        else | 
| -            delete backing; | 
| +            backing->owner()->unlink(); | 
| +        delete backing; | 
| } | 
| -    m_evictedBackings.swap(newEvictedBackings); | 
| +    m_evictedBackings.clear(); | 
| } | 
|  | 
| bool PrioritizedTextureManager::linkedEvictedBackingsExist() const | 
| { | 
| +    DCHECK(Proxy::isImplThread() && 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; | 
| @@ -441,6 +416,7 @@ void PrioritizedTextureManager::evictFirstBackingResource(ResourceProvider* reso | 
| backing->deleteResource(resourceProvider); | 
| m_memoryUseBytes -= backing->bytes(); | 
| m_backings.pop_front(); | 
| +    base::AutoLock scoped_lock(m_evictedBackingsLock); | 
| m_evictedBackings.push_back(backing); | 
| } | 
|  | 
| @@ -463,6 +439,7 @@ void PrioritizedTextureManager::assertInvariants() | 
| for (TextureSet::iterator it = m_textures.begin(); it != m_textures.end(); ++it) { | 
| PrioritizedTexture* texture = (*it); | 
| PrioritizedTexture::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()); | 
|  |