Commit 581fd42e authored by hiroshige's avatar hiroshige Committed by Commit bot

[WeakMemoryCache] Make references from MemoryCache to Resource Weak

Design doc (Step 1):
https://docs.google.com/document/d/1Pj4vzxzCKC_11SugdJ_x7wq7ErE-pHtf4w4FLKdcF7g/edit?usp=sharing

This cl relands
- https://codereview.chromium.org/1915113005
- https://codereview.chromium.org/2066763002
except for code related to Field-Trial or SharedBuffer::unlock().

BUG=603462

Review-Url: https://codereview.chromium.org/2296913003
Cr-Commit-Position: refs/heads/master@{#417245}
parent bdbc5974
...@@ -62,13 +62,21 @@ MemoryCache* replaceMemoryCacheForTesting(MemoryCache* cache) ...@@ -62,13 +62,21 @@ MemoryCache* replaceMemoryCacheForTesting(MemoryCache* cache)
DEFINE_TRACE(MemoryCacheEntry) DEFINE_TRACE(MemoryCacheEntry)
{ {
visitor->trace(m_resource); visitor->template registerWeakMembers<MemoryCacheEntry, &MemoryCacheEntry::clearResourceWeak>(this);
visitor->trace(m_previousInLiveResourcesList); visitor->trace(m_previousInLiveResourcesList);
visitor->trace(m_nextInLiveResourcesList); visitor->trace(m_nextInLiveResourcesList);
visitor->trace(m_previousInAllResourcesList); visitor->trace(m_previousInAllResourcesList);
visitor->trace(m_nextInAllResourcesList); visitor->trace(m_nextInAllResourcesList);
} }
void MemoryCacheEntry::clearResourceWeak(Visitor* visitor)
{
if (!m_resource || ThreadHeap::isHeapObjectAlive(m_resource))
return;
memoryCache()->remove(m_resource.get());
m_resource.clear();
}
void MemoryCacheEntry::dispose() void MemoryCacheEntry::dispose()
{ {
m_resource.clear(); m_resource.clear();
...@@ -159,7 +167,7 @@ void MemoryCache::add(Resource* resource) ...@@ -159,7 +167,7 @@ void MemoryCache::add(Resource* resource)
ASSERT(resource->url().isValid()); ASSERT(resource->url().isValid());
ResourceMap* resources = ensureResourceMap(resource->cacheIdentifier()); ResourceMap* resources = ensureResourceMap(resource->cacheIdentifier());
KURL url = removeFragmentIdentifierIfNeeded(resource->url()); KURL url = removeFragmentIdentifierIfNeeded(resource->url());
RELEASE_ASSERT(!resources->contains(url)); CHECK(!contains(resource));
resources->set(url, MemoryCacheEntry::create(resource)); resources->set(url, MemoryCacheEntry::create(resource));
update(resource, 0, resource->size(), true); update(resource, 0, resource->size(), true);
...@@ -206,8 +214,11 @@ HeapVector<Member<Resource>> MemoryCache::resourcesForURL(const KURL& resourceUR ...@@ -206,8 +214,11 @@ HeapVector<Member<Resource>> MemoryCache::resourcesForURL(const KURL& resourceUR
KURL url = removeFragmentIdentifierIfNeeded(resourceURL); KURL url = removeFragmentIdentifierIfNeeded(resourceURL);
HeapVector<Member<Resource>> results; HeapVector<Member<Resource>> results;
for (const auto& resourceMapIter : m_resourceMaps) { for (const auto& resourceMapIter : m_resourceMaps) {
if (MemoryCacheEntry* entry = resourceMapIter.value->get(url)) if (MemoryCacheEntry* entry = resourceMapIter.value->get(url)) {
results.append(entry->resource()); Resource* resource = entry->resource();
DCHECK(resource);
results.append(resource);
}
} }
return results; return results;
} }
...@@ -358,6 +369,7 @@ void MemoryCache::evict(MemoryCacheEntry* entry) ...@@ -358,6 +369,7 @@ void MemoryCache::evict(MemoryCacheEntry* entry)
ASSERT(WTF::isMainThread()); ASSERT(WTF::isMainThread());
Resource* resource = entry->resource(); Resource* resource = entry->resource();
DCHECK(resource);
RESOURCE_LOADING_DVLOG(1) << "Evicting resource " << resource << " for " << resource->url().getString() << " from cache"; RESOURCE_LOADING_DVLOG(1) << "Evicting resource " << resource << " for " << resource->url().getString() << " from cache";
TRACE_EVENT1("blink", "MemoryCache::evict", "resource", resource->url().getString().utf8()); TRACE_EVENT1("blink", "MemoryCache::evict", "resource", resource->url().getString().utf8());
// The resource may have already been removed by someone other than our caller, // The resource may have already been removed by someone other than our caller,
...@@ -379,7 +391,7 @@ void MemoryCache::evict(MemoryCacheEntry* entry) ...@@ -379,7 +391,7 @@ void MemoryCache::evict(MemoryCacheEntry* entry)
MemoryCacheEntry* MemoryCache::getEntryForResource(const Resource* resource) const MemoryCacheEntry* MemoryCache::getEntryForResource(const Resource* resource) const
{ {
if (resource->url().isNull() || resource->url().isEmpty()) if (!resource || resource->url().isNull() || resource->url().isEmpty())
return nullptr; return nullptr;
ResourceMap* resources = m_resourceMaps.get(resource->cacheIdentifier()); ResourceMap* resources = m_resourceMaps.get(resource->cacheIdentifier());
if (!resources) if (!resources)
...@@ -589,6 +601,7 @@ MemoryCache::Statistics MemoryCache::getStatistics() ...@@ -589,6 +601,7 @@ MemoryCache::Statistics MemoryCache::getStatistics()
for (const auto& resourceMapIter : m_resourceMaps) { for (const auto& resourceMapIter : m_resourceMaps) {
for (const auto& resourceIter : *resourceMapIter.value) { for (const auto& resourceIter : *resourceMapIter.value) {
Resource* resource = resourceIter.value->resource(); Resource* resource = resourceIter.value->resource();
DCHECK(resource);
switch (resource->getType()) { switch (resource->getType()) {
case Resource::Image: case Resource::Image:
stats.images.addResource(resource); stats.images.addResource(resource);
......
...@@ -96,7 +96,9 @@ private: ...@@ -96,7 +96,9 @@ private:
{ {
} }
Member<Resource> m_resource; void clearResourceWeak(Visitor*);
WeakMember<Resource> m_resource;
}; };
WILL_NOT_BE_EAGERLY_TRACED_CLASS(MemoryCacheEntry); WILL_NOT_BE_EAGERLY_TRACED_CLASS(MemoryCacheEntry);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment