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

Unified Diff: Source/core/fetch/MemoryCache.cpp

Issue 214773004: Fix crash in MemoryCache::replace. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years, 9 months 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 | « Source/core/fetch/MemoryCache.h ('k') | Source/core/fetch/MemoryCacheTest.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/fetch/MemoryCache.cpp
diff --git a/Source/core/fetch/MemoryCache.cpp b/Source/core/fetch/MemoryCache.cpp
index 7deda544049639131b00ff35e0a4a91cb35e2408..680536596b9316712c76f2c1dbab49d8fcdb5d1c 100644
--- a/Source/core/fetch/MemoryCache.cpp
+++ b/Source/core/fetch/MemoryCache.cpp
@@ -118,12 +118,22 @@ void MemoryCache::add(Resource* resource)
void MemoryCache::replace(Resource* newResource, Resource* oldResource)
{
- evict(oldResource);
+ if (MemoryCacheEntry* oldEntry = m_resources.get(oldResource->url()))
+ evict(oldEntry);
add(newResource);
if (newResource->decodedSize() && newResource->hasClients())
insertInLiveDecodedResourcesList(newResource);
}
+void MemoryCache::remove(Resource* resource)
+{
+ // The resource may have already been removed by someone other than our caller,
+ // who needed a fresh copy for a reload.
+ if (!contains(resource))
+ return;
+ evict(m_resources.get(resource->url()));
+}
+
bool MemoryCache::contains(const Resource* resource) const
{
if (resource->url().isNull())
@@ -142,7 +152,7 @@ Resource* MemoryCache::resourceForURL(const KURL& resourceURL)
Resource* resource = entry->m_resource.get();
if (resource && !resource->lock()) {
ASSERT(!resource->hasClients());
- bool didEvict = evict(resource);
+ bool didEvict = evict(entry);
ASSERT_UNUSED(didEvict, didEvict);
return 0;
}
@@ -226,7 +236,7 @@ void MemoryCache::pruneDeadResources()
if (current->m_resource->wasPurged()) {
ASSERT(!current->m_resource->hasClients());
ASSERT(!current->m_resource->isPreloaded());
- evict(current->m_resource.get());
+ evict(current);
}
current = previous;
}
@@ -266,7 +276,7 @@ void MemoryCache::pruneDeadResources()
MemoryCacheEntry* previous = current->m_previousInAllResourcesList;
ASSERT(!previous || contains(previous->m_resource.get()));
if (!current->m_resource->hasClients() && !current->m_resource->isPreloaded() && !current->m_resource->isCacheValidator()) {
- evict(current->m_resource.get());
+ evict(current);
if (targetSize && m_deadSize <= targetSize)
return;
}
@@ -295,20 +305,17 @@ void MemoryCache::setCapacities(size_t minDeadBytes, size_t maxDeadBytes, size_t
prune();
}
-bool MemoryCache::evict(Resource* resource)
+bool MemoryCache::evict(MemoryCacheEntry* entry)
{
ASSERT(WTF::isMainThread());
+
+ Resource* resource = entry->m_resource.get();
WTF_LOG(ResourceLoading, "Evicting resource %p for '%s' from cache", resource, resource->url().string().latin1().data());
// The resource may have already been removed by someone other than our caller,
// who needed a fresh copy for a reload. See <http://bugs.webkit.org/show_bug.cgi?id=12479#c6>.
- if (contains(resource)) {
- update(resource, resource->size(), 0, false);
- removeFromLiveDecodedResourcesList(resource);
-
- // Remove from the resource map.
- m_resources.remove(resource->url());
- }
-
+ update(resource, resource->size(), 0, false);
+ removeFromLiveDecodedResourcesList(resource);
+ m_resources.remove(resource->url());
return resource->deleteIfPossible();
}
@@ -560,7 +567,7 @@ void MemoryCache::evictResources()
ResourceMap::iterator i = m_resources.begin();
if (i == m_resources.end())
break;
- evict(i->value->m_resource.get());
+ evict(i->value.get());
}
}
@@ -602,7 +609,8 @@ void MemoryCache::prune(Resource* justReleasedResource)
// objects O(N^2) if we pruned immediately. This immediate eviction is a
// safeguard against runaway memory consumption by dead resources
// while a prune is pending.
- evict(justReleasedResource);
+ if (contains(justReleasedResource))
+ evict(m_resources.get(justReleasedResource->url()));
// As a last resort, prune immediately
if (m_deadSize > m_maxDeferredPruneDeadCapacity)
« no previous file with comments | « Source/core/fetch/MemoryCache.h ('k') | Source/core/fetch/MemoryCacheTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698