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

Side by Side Diff: Source/core/fetch/MemoryCache.cpp

Issue 640463003: MemoryCache: Enable MemoryCache to have multiple isolated resource maps (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: remake Created 6 years, 2 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 unified diff | Download patch
OLDNEW
1 /* 1 /*
2 Copyright (C) 1998 Lars Knoll (knoll@mpi-hd.mpg.de) 2 Copyright (C) 1998 Lars Knoll (knoll@mpi-hd.mpg.de)
3 Copyright (C) 2001 Dirk Mueller (mueller@kde.org) 3 Copyright (C) 2001 Dirk Mueller (mueller@kde.org)
4 Copyright (C) 2002 Waldo Bastian (bastian@kde.org) 4 Copyright (C) 2002 Waldo Bastian (bastian@kde.org)
5 Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. 5 Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
6 6
7 This library is free software; you can redistribute it and/or 7 This library is free software; you can redistribute it and/or
8 modify it under the terms of the GNU Library General Public 8 modify it under the terms of the GNU Library General Public
9 License as published by the Free Software Foundation; either 9 License as published by the Free Software Foundation; either
10 version 2 of the License, or (at your option) any later version. 10 version 2 of the License, or (at your option) any later version.
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
146 // Strip away fragment identifier from HTTP URLs. 146 // Strip away fragment identifier from HTTP URLs.
147 // Data URLs must be unmodified. For file and custom URLs clients may expect resources 147 // Data URLs must be unmodified. For file and custom URLs clients may expect resources
148 // to be unique even when they differ by the fragment identifier only. 148 // to be unique even when they differ by the fragment identifier only.
149 if (!originalURL.protocolIsInHTTPFamily()) 149 if (!originalURL.protocolIsInHTTPFamily())
150 return originalURL; 150 return originalURL;
151 KURL url = originalURL; 151 KURL url = originalURL;
152 url.removeFragmentIdentifier(); 152 url.removeFragmentIdentifier();
153 return url; 153 return url;
154 } 154 }
155 155
156 String MemoryCache::defaultCacheIdentifier()
157 {
158 return emptyString();
159 }
160
161 MemoryCache::ResourceMap* MemoryCache::getResourceMap(const String& cacheIdentif ier)
162 {
163 if (!m_resources.contains(cacheIdentifier))
164 m_resources.add(cacheIdentifier, adoptPtrWillBeNoop(new ResourceMap()));
Mike West 2014/10/24 12:42:59 `add()` can fail, can't it? That could cause a nul
nhiroki 2014/10/27 14:30:12 Hmmm... I think a null-deref never happens because
165 return m_resources.get(cacheIdentifier);
166 }
167
156 void MemoryCache::add(Resource* resource) 168 void MemoryCache::add(Resource* resource)
157 { 169 {
158 ASSERT(WTF::isMainThread()); 170 ASSERT(WTF::isMainThread());
159 ASSERT(resource->url().isValid()); 171 ASSERT(resource->url().isValid());
160 RELEASE_ASSERT(!m_resources.contains(resource->url())); 172 ResourceMap* resources = getResourceMap(resource->cacheIdentifier());
161 m_resources.set(resource->url().string(), MemoryCacheEntry::create(resource) ); 173 RELEASE_ASSERT(!resources->contains(resource->url()));
174 resources->set(resource->url(), MemoryCacheEntry::create(resource));
162 update(resource, 0, resource->size(), true); 175 update(resource, 0, resource->size(), true);
163 176
164 WTF_LOG(ResourceLoading, "MemoryCache::add Added '%s', resource %p\n", resou rce->url().string().latin1().data(), resource); 177 WTF_LOG(ResourceLoading, "MemoryCache::add Added '%s', resource %p\n", resou rce->url().string().latin1().data(), resource);
165 } 178 }
166 179
167 void MemoryCache::replace(Resource* newResource, Resource* oldResource) 180 void MemoryCache::replace(Resource* newResource, Resource* oldResource)
168 { 181 {
169 if (MemoryCacheEntry* oldEntry = m_resources.get(oldResource->url())) 182 ASSERT(newResource->cacheIdentifier() == oldResource->cacheIdentifier());
183 ResourceMap* resources = getResourceMap(oldResource->cacheIdentifier());
184 if (MemoryCacheEntry* oldEntry = resources->get(oldResource->url()))
170 evict(oldEntry); 185 evict(oldEntry);
171 add(newResource); 186 add(newResource);
172 if (newResource->decodedSize() && newResource->hasClients()) 187 if (newResource->decodedSize() && newResource->hasClients())
173 insertInLiveDecodedResourcesList(m_resources.get(newResource->url())); 188 insertInLiveDecodedResourcesList(resources->get(newResource->url()));
174 } 189 }
175 190
176 void MemoryCache::remove(Resource* resource) 191 void MemoryCache::remove(Resource* resource)
177 { 192 {
178 // The resource may have already been removed by someone other than our call er, 193 // The resource may have already been removed by someone other than our call er,
179 // who needed a fresh copy for a reload. 194 // who needed a fresh copy for a reload.
180 if (!contains(resource)) 195 if (!contains(resource))
Mike West 2014/10/24 12:42:59 Rather than doing the lookup twice, it might make
nhiroki 2014/10/27 14:30:13 Good point! Removed redundant contains() calls.
181 return; 196 return;
182 evict(m_resources.get(resource->url())); 197 evict(getEntryForResource(resource));
183 } 198 }
184 199
185 bool MemoryCache::contains(const Resource* resource) const 200 bool MemoryCache::contains(const Resource* resource) const
186 { 201 {
187 if (resource->url().isNull()) 202 if (resource->url().isNull())
188 return false; 203 return false;
189 const MemoryCacheEntry* entry = m_resources.get(resource->url()); 204 ResourceMap* resources = m_resources.get(resource->cacheIdentifier());
Mike West 2014/10/24 12:43:00 It's odd to have `getResourceMap` and not use it h
nhiroki 2014/10/27 14:30:12 Yes, that's right.
205 if (!resources)
206 return false;
207 MemoryCacheEntry* entry = resources->get(resource->url());
190 return entry && entry->m_resource == resource; 208 return entry && entry->m_resource == resource;
191 } 209 }
192 210
193 Resource* MemoryCache::resourceForURL(const KURL& resourceURL) 211 Resource* MemoryCache::resourceForURL(const String& cacheIdentifier, const KURL& resourceURL)
194 { 212 {
195 ASSERT(WTF::isMainThread()); 213 ASSERT(WTF::isMainThread());
214 ResourceMap* resources = getResourceMap(cacheIdentifier);
196 KURL url = removeFragmentIdentifierIfNeeded(resourceURL); 215 KURL url = removeFragmentIdentifierIfNeeded(resourceURL);
197 MemoryCacheEntry* entry = m_resources.get(url); 216 MemoryCacheEntry* entry = resources->get(url);
198 if (!entry) 217 if (!entry)
199 return 0; 218 return 0;
200 Resource* resource = entry->m_resource.get(); 219 Resource* resource = entry->m_resource.get();
201 if (resource && !resource->lock()) { 220 if (resource && !resource->lock()) {
202 ASSERT(!resource->hasClients()); 221 ASSERT(!resource->hasClients());
203 bool didEvict = evict(entry); 222 bool didEvict = evict(entry);
204 ASSERT_UNUSED(didEvict, didEvict); 223 ASSERT_UNUSED(didEvict, didEvict);
205 return 0; 224 return 0;
206 } 225 }
207 return resource; 226 return resource;
208 } 227 }
209 228
229 WillBeHeapVector<Member<Resource>> MemoryCache::resourcesForURL(const KURL& reso urceURL)
230 {
231 ASSERT(WTF::isMainThread());
232 KURL url = removeFragmentIdentifierIfNeeded(resourceURL);
233 WillBeHeapVector<Member<Resource>> results;
234 for (const auto& resources : m_resources) {
Mike West 2014/10/24 12:42:59 "ResourceMap" seems clearer than "auto".
nhiroki 2014/10/27 14:30:12 "m_resources" is a HashMap object, so this "auto"
235 MemoryCacheEntry* entry = resources.value->get(url);
236 if (entry)
237 results.append(entry->m_resource.get());
238 }
239 return results;
240 }
241
210 size_t MemoryCache::deadCapacity() const 242 size_t MemoryCache::deadCapacity() const
211 { 243 {
212 // Dead resource capacity is whatever space is not occupied by live resource s, bounded by an independent minimum and maximum. 244 // Dead resource capacity is whatever space is not occupied by live resource s, bounded by an independent minimum and maximum.
213 size_t capacity = m_capacity - std::min(m_liveSize, m_capacity); // Start wi th available capacity. 245 size_t capacity = m_capacity - std::min(m_liveSize, m_capacity); // Start wi th available capacity.
214 capacity = std::max(capacity, m_minDeadCapacity); // Make sure it's above th e minimum. 246 capacity = std::max(capacity, m_minDeadCapacity); // Make sure it's above th e minimum.
215 capacity = std::min(capacity, m_maxDeadCapacity); // Make sure it's below th e maximum. 247 capacity = std::min(capacity, m_maxDeadCapacity); // Make sure it's below th e maximum.
216 return capacity; 248 return capacity;
217 } 249 }
218 250
219 size_t MemoryCache::liveCapacity() const 251 size_t MemoryCache::liveCapacity() const
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
367 ASSERT(WTF::isMainThread()); 399 ASSERT(WTF::isMainThread());
368 400
369 Resource* resource = entry->m_resource.get(); 401 Resource* resource = entry->m_resource.get();
370 bool canDelete = resource->canDelete(); 402 bool canDelete = resource->canDelete();
371 WTF_LOG(ResourceLoading, "Evicting resource %p for '%s' from cache", resourc e, resource->url().string().latin1().data()); 403 WTF_LOG(ResourceLoading, "Evicting resource %p for '%s' from cache", resourc e, resource->url().string().latin1().data());
372 // The resource may have already been removed by someone other than our call er, 404 // The resource may have already been removed by someone other than our call er,
373 // who needed a fresh copy for a reload. See <http://bugs.webkit.org/show_bu g.cgi?id=12479#c6>. 405 // who needed a fresh copy for a reload. See <http://bugs.webkit.org/show_bu g.cgi?id=12479#c6>.
374 update(resource, resource->size(), 0, false); 406 update(resource, resource->size(), 0, false);
375 removeFromLiveDecodedResourcesList(entry); 407 removeFromLiveDecodedResourcesList(entry);
376 408
377 ResourceMap::iterator it = m_resources.find(resource->url()); 409 ResourceMap* resources = getResourceMap(resource->cacheIdentifier());
378 ASSERT(it != m_resources.end()); 410 ResourceMap::iterator it = resources->find(resource->url());
411 ASSERT(it != resources->end());
379 #if ENABLE(OILPAN) 412 #if ENABLE(OILPAN)
380 MemoryCacheEntry* entryPtr = it->value; 413 MemoryCacheEntry* entryPtr = it->value;
381 #else 414 #else
382 OwnPtr<MemoryCacheEntry> entryPtr; 415 OwnPtr<MemoryCacheEntry> entryPtr;
383 entryPtr.swap(it->value); 416 entryPtr.swap(it->value);
384 #endif 417 #endif
385 m_resources.remove(it); 418 resources->remove(it);
386 #if ENABLE(OILPAN) 419 #if ENABLE(OILPAN)
387 if (entryPtr) 420 if (entryPtr)
388 entryPtr->dispose(); 421 entryPtr->dispose();
389 #endif 422 #endif
390 return canDelete; 423 return canDelete;
391 } 424 }
392 425
426 MemoryCacheEntry* MemoryCache::getEntryForResource(const Resource* resource) con st
427 {
428 if (resource->url().isNull())
Mike West 2014/10/24 12:43:00 isNull or isEmpty?
nhiroki 2014/10/27 14:30:13 Done.
429 return nullptr;
430 ResourceMap* resources = m_resources.get(resource->cacheIdentifier());
431 if (!resources)
432 return nullptr;
433 MemoryCacheEntry* entry = resources->get(resource->url());
434 if (!entry || entry->m_resource != resource)
435 return nullptr;
436 return entry;
437 }
438
393 MemoryCacheLRUList* MemoryCache::lruListFor(unsigned accessCount, size_t size) 439 MemoryCacheLRUList* MemoryCache::lruListFor(unsigned accessCount, size_t size)
394 { 440 {
395 ASSERT(accessCount > 0); 441 ASSERT(accessCount > 0);
396 unsigned queueIndex = WTF::fastLog2(size / accessCount); 442 unsigned queueIndex = WTF::fastLog2(size / accessCount);
397 if (m_allResources.size() <= queueIndex) 443 if (m_allResources.size() <= queueIndex)
398 m_allResources.grow(queueIndex + 1); 444 m_allResources.grow(queueIndex + 1);
399 return &m_allResources[queueIndex]; 445 return &m_allResources[queueIndex];
400 } 446 }
401 447
402 void MemoryCache::removeFromLRUList(MemoryCacheEntry* entry, MemoryCacheLRUList* list) 448 void MemoryCache::removeFromLRUList(MemoryCacheEntry* entry, MemoryCacheLRUList* list)
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
515 m_liveSize += resource->size(); 561 m_liveSize += resource->size();
516 m_deadSize -= resource->size(); 562 m_deadSize -= resource->size();
517 } 563 }
518 564
519 void MemoryCache::makeDead(Resource* resource) 565 void MemoryCache::makeDead(Resource* resource)
520 { 566 {
521 if (!contains(resource)) 567 if (!contains(resource))
522 return; 568 return;
523 m_liveSize -= resource->size(); 569 m_liveSize -= resource->size();
524 m_deadSize += resource->size(); 570 m_deadSize += resource->size();
525 removeFromLiveDecodedResourcesList(m_resources.get(resource->url())); 571 removeFromLiveDecodedResourcesList(getEntryForResource(resource));
526 } 572 }
527 573
528 void MemoryCache::update(Resource* resource, size_t oldSize, size_t newSize, boo l wasAccessed) 574 void MemoryCache::update(Resource* resource, size_t oldSize, size_t newSize, boo l wasAccessed)
529 { 575 {
530 if (!contains(resource)) 576 if (!contains(resource))
531 return; 577 return;
532 MemoryCacheEntry* entry = m_resources.get(resource->url()); 578 MemoryCacheEntry* entry = getEntryForResource(resource);
533 579
534 // The object must now be moved to a different queue, since either its size or its accessCount has been changed, 580 // The object must now be moved to a different queue, since either its size or its accessCount has been changed,
535 // and both of those are used to determine which LRU queue the resource shou ld be in. 581 // and both of those are used to determine which LRU queue the resource shou ld be in.
536 if (oldSize) 582 if (oldSize)
537 removeFromLRUList(entry, lruListFor(entry->m_accessCount, oldSize)); 583 removeFromLRUList(entry, lruListFor(entry->m_accessCount, oldSize));
538 if (wasAccessed) 584 if (wasAccessed)
539 entry->m_accessCount++; 585 entry->m_accessCount++;
540 if (newSize) 586 if (newSize)
541 insertInLRUList(entry, lruListFor(entry->m_accessCount, newSize)); 587 insertInLRUList(entry, lruListFor(entry->m_accessCount, newSize));
542 588
543 ptrdiff_t delta = newSize - oldSize; 589 ptrdiff_t delta = newSize - oldSize;
544 if (resource->hasClients()) { 590 if (resource->hasClients()) {
545 ASSERT(delta >= 0 || m_liveSize >= static_cast<size_t>(-delta) ); 591 ASSERT(delta >= 0 || m_liveSize >= static_cast<size_t>(-delta) );
546 m_liveSize += delta; 592 m_liveSize += delta;
547 } else { 593 } else {
548 ASSERT(delta >= 0 || m_deadSize >= static_cast<size_t>(-delta) ); 594 ASSERT(delta >= 0 || m_deadSize >= static_cast<size_t>(-delta) );
549 m_deadSize += delta; 595 m_deadSize += delta;
550 } 596 }
551 } 597 }
552 598
553 void MemoryCache::updateDecodedResource(Resource* resource, UpdateReason reason, MemoryCacheLiveResourcePriority priority) 599 void MemoryCache::updateDecodedResource(Resource* resource, UpdateReason reason, MemoryCacheLiveResourcePriority priority)
554 { 600 {
555 if (!contains(resource)) 601 if (!contains(resource))
556 return; 602 return;
557 MemoryCacheEntry* entry = m_resources.get(resource->url()); 603 MemoryCacheEntry* entry = getEntryForResource(resource);
558 604
559 removeFromLiveDecodedResourcesList(entry); 605 removeFromLiveDecodedResourcesList(entry);
560 if (priority != MemoryCacheLiveResourcePriorityUnknown && priority != entry- >m_liveResourcePriority) 606 if (priority != MemoryCacheLiveResourcePriorityUnknown && priority != entry- >m_liveResourcePriority)
561 entry->m_liveResourcePriority = priority; 607 entry->m_liveResourcePriority = priority;
562 if (resource->decodedSize() && resource->hasClients()) 608 if (resource->decodedSize() && resource->hasClients())
563 insertInLiveDecodedResourcesList(entry); 609 insertInLiveDecodedResourcesList(entry);
564 610
565 if (reason != UpdateForAccess) 611 if (reason != UpdateForAccess)
566 return; 612 return;
567 613
568 double timestamp = resource->isImage() ? FrameView::currentFrameTimeStamp() : 0.0; 614 double timestamp = resource->isImage() ? FrameView::currentFrameTimeStamp() : 0.0;
569 if (!timestamp) 615 if (!timestamp)
570 timestamp = currentTime(); 616 timestamp = currentTime();
571 entry->m_lastDecodedAccessTime = timestamp; 617 entry->m_lastDecodedAccessTime = timestamp;
572 } 618 }
573 619
574 MemoryCacheLiveResourcePriority MemoryCache::priority(Resource* resource) const 620 MemoryCacheLiveResourcePriority MemoryCache::priority(Resource* resource) const
575 { 621 {
576 if (!contains(resource)) 622 if (!contains(resource))
577 return MemoryCacheLiveResourcePriorityUnknown; 623 return MemoryCacheLiveResourcePriorityUnknown;
578 MemoryCacheEntry* entry = m_resources.get(resource->url()); 624 MemoryCacheEntry* entry = getEntryForResource(resource);
579 return entry->m_liveResourcePriority; 625 return entry->m_liveResourcePriority;
580 } 626 }
581 627
582 void MemoryCache::removeURLFromCache(ExecutionContext* context, const KURL& url) 628 void MemoryCache::removeURLFromCache(ExecutionContext* context, const KURL& url)
583 { 629 {
584 if (context->isWorkerGlobalScope()) { 630 if (context->isWorkerGlobalScope()) {
585 WorkerGlobalScope* workerGlobalScope = toWorkerGlobalScope(context); 631 WorkerGlobalScope* workerGlobalScope = toWorkerGlobalScope(context);
586 workerGlobalScope->thread()->workerLoaderProxy().postTaskToLoader(create CrossThreadTask(&removeURLFromCacheInternal, url)); 632 workerGlobalScope->thread()->workerLoaderProxy().postTaskToLoader(create CrossThreadTask(&removeURLFromCacheInternal, url));
587 return; 633 return;
588 } 634 }
589 removeURLFromCacheInternal(context, url); 635 removeURLFromCacheInternal(context, url);
590 } 636 }
591 637
592 void MemoryCache::removeURLFromCacheInternal(ExecutionContext*, const KURL& url) 638 void MemoryCache::removeURLFromCacheInternal(ExecutionContext*, const KURL& url)
593 { 639 {
594 if (Resource* resource = memoryCache()->resourceForURL(url)) 640 auto resources = memoryCache()->resourcesForURL(url);
641 for (const auto& resource : resources)
Mike West 2014/10/24 12:42:59 "Resource" seems clearer than "auto".
nhiroki 2014/10/27 14:30:12 Done.
595 memoryCache()->remove(resource); 642 memoryCache()->remove(resource);
596 } 643 }
597 644
598 void MemoryCache::TypeStatistic::addResource(Resource* o) 645 void MemoryCache::TypeStatistic::addResource(Resource* o)
599 { 646 {
600 bool purged = o->wasPurged(); 647 bool purged = o->wasPurged();
601 bool purgeable = o->isPurgeable() && !purged; 648 bool purgeable = o->isPurgeable() && !purged;
602 size_t pageSize = (o->encodedSize() + o->overheadSize() + 4095) & ~4095; 649 size_t pageSize = (o->encodedSize() + o->overheadSize() + 4095) & ~4095;
603 count++; 650 count++;
604 size += purged ? 0 : o->size(); 651 size += purged ? 0 : o->size();
605 liveSize += o->hasClients() ? o->size() : 0; 652 liveSize += o->hasClients() ? o->size() : 0;
606 decodedSize += o->decodedSize(); 653 decodedSize += o->decodedSize();
607 encodedSize += o->encodedSize(); 654 encodedSize += o->encodedSize();
608 encodedSizeDuplicatedInDataURLs += o->url().protocolIsData() ? o->encodedSiz e() : 0; 655 encodedSizeDuplicatedInDataURLs += o->url().protocolIsData() ? o->encodedSiz e() : 0;
609 purgeableSize += purgeable ? pageSize : 0; 656 purgeableSize += purgeable ? pageSize : 0;
610 purgedSize += purged ? pageSize : 0; 657 purgedSize += purged ? pageSize : 0;
611 } 658 }
612 659
613 MemoryCache::Statistics MemoryCache::getStatistics() 660 MemoryCache::Statistics MemoryCache::getStatistics()
614 { 661 {
615 Statistics stats; 662 Statistics stats;
616 for (const auto& resourceIter : m_resources) { 663 for (const auto& resources : m_resources) {
Mike West 2014/10/24 12:42:59 "ResourceMap* resourceMap" seems clearer.
nhiroki 2014/10/27 14:30:13 Ditto ("const OwnPtr<ResourceMap>& resources"?).
617 Resource* resource = resourceIter.value->m_resource.get(); 664 for (const auto& resourceIter : *resources.value) {
Mike West 2014/10/24 12:42:59 Resource rather than auto.
nhiroki 2014/10/27 14:30:12 Ditto.
618 switch (resource->type()) { 665 Resource* resource = resourceIter.value->m_resource.get();
619 case Resource::Image: 666 switch (resource->type()) {
620 stats.images.addResource(resource); 667 case Resource::Image:
621 break; 668 stats.images.addResource(resource);
622 case Resource::CSSStyleSheet: 669 break;
623 stats.cssStyleSheets.addResource(resource); 670 case Resource::CSSStyleSheet:
624 break; 671 stats.cssStyleSheets.addResource(resource);
625 case Resource::Script: 672 break;
626 stats.scripts.addResource(resource); 673 case Resource::Script:
627 break; 674 stats.scripts.addResource(resource);
628 case Resource::XSLStyleSheet: 675 break;
629 stats.xslStyleSheets.addResource(resource); 676 case Resource::XSLStyleSheet:
630 break; 677 stats.xslStyleSheets.addResource(resource);
631 case Resource::Font: 678 break;
632 stats.fonts.addResource(resource); 679 case Resource::Font:
633 break; 680 stats.fonts.addResource(resource);
634 default: 681 break;
635 stats.other.addResource(resource); 682 default:
636 break; 683 stats.other.addResource(resource);
684 break;
685 }
637 } 686 }
638 } 687 }
639 return stats; 688 return stats;
640 } 689 }
641 690
642 void MemoryCache::evictResources() 691 void MemoryCache::evictResources()
643 { 692 {
644 for (;;) { 693 for (;;) {
645 ResourceMap::iterator i = m_resources.begin(); 694 ResourceMapIndex::iterator indexIter = m_resources.begin();
646 if (i == m_resources.end()) 695 if (indexIter == m_resources.end())
647 break; 696 break;
648 evict(i->value.get()); 697 ResourceMap* resources = indexIter->value.get();
698 for (;;) {
Mike West 2014/10/24 12:42:59 Would you mind changing this, and line 693, to `wh
nhiroki 2014/10/27 14:30:13 Done.
699 ResourceMap::iterator resourceIter = resources->begin();
700 if (resourceIter == resources->end())
701 break;
702 evict(resourceIter->value.get());
703 }
704 m_resources.remove(indexIter);
649 } 705 }
650 } 706 }
651 707
652 void MemoryCache::prune(Resource* justReleasedResource) 708 void MemoryCache::prune(Resource* justReleasedResource)
653 { 709 {
654 TRACE_EVENT0("renderer", "MemoryCache::prune()"); 710 TRACE_EVENT0("renderer", "MemoryCache::prune()");
655 711
656 if (m_inPruneResources) 712 if (m_inPruneResources)
657 return; 713 return;
658 if (m_liveSize + m_deadSize <= m_capacity && m_maxDeadCapacity && m_deadSize <= m_maxDeadCapacity) // Fast path. 714 if (m_liveSize + m_deadSize <= m_capacity && m_maxDeadCapacity && m_deadSize <= m_maxDeadCapacity) // Fast path.
(...skipping 24 matching lines...) Expand all
683 if (m_prunePending && m_deadSize > m_maxDeferredPruneDeadCapacity && justRel easedResource) { 739 if (m_prunePending && m_deadSize > m_maxDeferredPruneDeadCapacity && justRel easedResource) {
684 // The following eviction does not respect LRU order, but it can be done 740 // The following eviction does not respect LRU order, but it can be done
685 // immediately in constant time, as opposed to pruneDeadResources, which 741 // immediately in constant time, as opposed to pruneDeadResources, which
686 // we would rather defer because it is O(N), which would make tear-down of N 742 // we would rather defer because it is O(N), which would make tear-down of N
687 // objects O(N^2) if we pruned immediately. This immediate eviction is a 743 // objects O(N^2) if we pruned immediately. This immediate eviction is a
688 // safeguard against runaway memory consumption by dead resources 744 // safeguard against runaway memory consumption by dead resources
689 // while a prune is pending. 745 // while a prune is pending.
690 // Main Resources in the cache are only substitue data that was 746 // Main Resources in the cache are only substitue data that was
691 // precached and should not be evicted. 747 // precached and should not be evicted.
692 if (contains(justReleasedResource) && justReleasedResource->type() != Re source::MainResource) 748 if (contains(justReleasedResource) && justReleasedResource->type() != Re source::MainResource)
693 evict(m_resources.get(justReleasedResource->url())); 749 evict(getEntryForResource(justReleasedResource));
694 750
695 // As a last resort, prune immediately 751 // As a last resort, prune immediately
696 if (m_deadSize > m_maxDeferredPruneDeadCapacity) 752 if (m_deadSize > m_maxDeferredPruneDeadCapacity)
697 pruneNow(currentTime); 753 pruneNow(currentTime);
698 } 754 }
699 } 755 }
700 756
701 void MemoryCache::willProcessTask() 757 void MemoryCache::willProcessTask()
702 { 758 {
703 } 759 }
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
785 printf("(%.1fK, %.1fK, %uA, %dR, %d, %d); ", current->decodedSiz e() / 1024.0f, (current->encodedSize() + current->overheadSize()) / 1024.0f, cur rent->accessCount(), current->hasClients(), current->isPurgeable(), current->was Purged()); 841 printf("(%.1fK, %.1fK, %uA, %dR, %d, %d); ", current->decodedSiz e() / 1024.0f, (current->encodedSize() + current->overheadSize()) / 1024.0f, cur rent->accessCount(), current->hasClients(), current->isPurgeable(), current->was Purged());
786 842
787 current = prev; 843 current = prev;
788 } 844 }
789 } 845 }
790 } 846 }
791 847
792 #endif // MEMORY_CACHE_STATS 848 #endif // MEMORY_CACHE_STATS
793 849
794 } // namespace blink 850 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698