void MemoryCache::remove(CachedResource& resource) { ASSERT(WTF::isMainThread()); 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 (auto* resources = sessionResourceMap(resource.sessionID())) { #if ENABLE(CACHE_PARTITIONING) auto key = std::make_pair(resource.url(), resource.cachePartition()); #else auto& key = resource.url(); #endif if (resource.inCache()) { // Remove resource from the resource map. resources->remove(key); resource.setInCache(false); // If the resource map is now empty, remove it from m_sessionResources. if (resources->isEmpty()) m_sessionResources.remove(resource.sessionID()); // Remove from the appropriate LRU list. removeFromLRUList(resource); removeFromLiveDecodedResourcesList(resource); adjustSize(resource.hasClients(), -static_cast<int>(resource.size())); } else ASSERT(resources->get(key) != &resource); } resource.deleteIfPossible(); }
bool MemoryCache::evict(MemoryCacheEntry* entry) { ASSERT(WTF::isMainThread()); Resource* resource = entry->m_resource.get(); bool canDelete = resource->canDelete(); 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>. update(resource, resource->size(), 0, false); removeFromLiveDecodedResourcesList(entry); ResourceMap* resources = m_resourceMaps.get(resource->cacheIdentifier()); ASSERT(resources); ResourceMap::iterator it = resources->find(resource->url()); ASSERT(it != resources->end()); #if ENABLE(OILPAN) MemoryCacheEntry* entryPtr = it->value; #else OwnPtr<MemoryCacheEntry> entryPtr; entryPtr.swap(it->value); #endif resources->remove(it); #if ENABLE(OILPAN) if (entryPtr) entryPtr->dispose(); #endif return canDelete; }
void MemoryCache::makeDead(Resource* resource) { if (!contains(resource)) return; m_liveSize -= resource->size(); m_deadSize += resource->size(); removeFromLiveDecodedResourcesList(getEntryForResource(resource)); }
void MemoryCache::evict(Resource* resource) { ASSERT(WTF::isMainThread()); 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 (resource->inCache()) { // Remove from the resource map. m_resources.remove(resource->url()); resource->setInCache(false); // Remove from the appropriate LRU list. removeFromLRUList(resource); removeFromLiveDecodedResourcesList(resource); adjustSize(resource->hasClients(), -static_cast<int>(resource->size())); } else ASSERT(m_resources.get(resource->url()) != resource); resource->deleteIfPossible(); }
void MemoryCache::updateDecodedResource(Resource* resource, UpdateReason reason, MemoryCacheLiveResourcePriority priority) { MemoryCacheEntry* entry = getEntryForResource(resource); if (!entry) return; removeFromLiveDecodedResourcesList(entry); if (priority != MemoryCacheLiveResourcePriorityUnknown && priority != entry->m_liveResourcePriority) entry->m_liveResourcePriority = priority; if (resource->decodedSize() && resource->hasClients()) insertInLiveDecodedResourcesList(entry); if (reason != UpdateForAccess) return; double timestamp = resource->isImage() ? m_lastFramePaintTimeStamp : 0.0; if (!timestamp) timestamp = currentTime(); entry->m_lastDecodedAccessTime = timestamp; }
void MemoryCache::evict(CachedResource* resource) { ASSERT(WTF::isMainThread()); 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 (resource->inCache()) { // Remove from the resource map. #if ENABLE(CACHE_PARTITIONING) CachedResourceItem* item = m_resources.get(resource->url()); if (item) { item->remove(resource->cachePartition()); if (!item->size()) m_resources.remove(resource->url()); } #else m_resources.remove(resource->url()); #endif resource->setInCache(false); // Remove from the appropriate LRU list. removeFromLRUList(resource); removeFromLiveDecodedResourcesList(resource); // If the resource was purged, it means we had already decremented the size when we made the // resource purgeable in makeResourcePurgeable(). So adjust the size if we are evicting a // resource that was not marked as purgeable. if (!MemoryCache::shouldMakeResourcePurgeableOnEviction() || !resource->isPurgeable()) adjustSize(resource->hasClients(), -static_cast<int>(resource->size())); } else #if ENABLE(CACHE_PARTITIONING) ASSERT(!m_resources.get(resource->url()) || m_resources.get(resource->url())->get(resource->cachePartition()) != resource); #else ASSERT(m_resources.get(resource->url()) != resource); #endif resource->deleteIfPossible(); }