| OLD | NEW |
| 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. |
| 11 | 11 |
| 12 This library is distributed in the hope that it will be useful, | 12 This library is distributed in the hope that it will be useful, |
| 13 but WITHOUT ANY WARRANTY; without even the implied warranty of | 13 but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 15 Library General Public License for more details. | 15 Library General Public License for more details. |
| 16 | 16 |
| 17 You should have received a copy of the GNU Library General Public License | 17 You should have received a copy of the GNU Library General Public License |
| 18 along with this library; see the file COPYING.LIB. If not, write to | 18 along with this library; see the file COPYING.LIB. If not, write to |
| 19 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | 19 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
| 20 Boston, MA 02110-1301, USA. | 20 Boston, MA 02110-1301, USA. |
| 21 */ | 21 */ |
| 22 | 22 |
| 23 #include "core/fetch/MemoryCache.h" | 23 #include "core/fetch/MemoryCache.h" |
| 24 | 24 |
| 25 #include "platform/Logging.h" | 25 #include "platform/Logging.h" |
| 26 #include "platform/RuntimeEnabledFeatures.h" | |
| 27 #include "platform/TraceEvent.h" | 26 #include "platform/TraceEvent.h" |
| 28 #include "platform/weborigin/SecurityOrigin.h" | 27 #include "platform/weborigin/SecurityOrigin.h" |
| 29 #include "platform/weborigin/SecurityOriginHash.h" | 28 #include "platform/weborigin/SecurityOriginHash.h" |
| 30 #include "public/platform/Platform.h" | 29 #include "public/platform/Platform.h" |
| 31 #include "wtf/Assertions.h" | 30 #include "wtf/Assertions.h" |
| 32 #include "wtf/CurrentTime.h" | 31 #include "wtf/CurrentTime.h" |
| 33 #include "wtf/MathExtras.h" | 32 #include "wtf/MathExtras.h" |
| 34 #include "wtf/TemporaryChange.h" | 33 #include "wtf/TemporaryChange.h" |
| 35 #include "wtf/text/CString.h" | 34 #include "wtf/text/CString.h" |
| 36 | 35 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 54 | 53 |
| 55 MemoryCache* replaceMemoryCacheForTesting(MemoryCache* cache) | 54 MemoryCache* replaceMemoryCacheForTesting(MemoryCache* cache) |
| 56 { | 55 { |
| 57 memoryCache(); | 56 memoryCache(); |
| 58 MemoryCache* oldCache = gMemoryCache->release(); | 57 MemoryCache* oldCache = gMemoryCache->release(); |
| 59 *gMemoryCache = cache; | 58 *gMemoryCache = cache; |
| 60 MemoryCacheDumpProvider::instance()->setMemoryCache(cache); | 59 MemoryCacheDumpProvider::instance()->setMemoryCache(cache); |
| 61 return oldCache; | 60 return oldCache; |
| 62 } | 61 } |
| 63 | 62 |
| 64 MemoryCacheEntry::MemoryCacheEntry(Resource* resource) | |
| 65 : m_inLiveDecodedResourcesList(false) | |
| 66 , m_accessCount(0) | |
| 67 , m_lastDecodedAccessTime(0.0) | |
| 68 , m_previousInLiveResourcesList(nullptr) | |
| 69 , m_nextInLiveResourcesList(nullptr) | |
| 70 , m_previousInAllResourcesList(nullptr) | |
| 71 , m_nextInAllResourcesList(nullptr) | |
| 72 { | |
| 73 if (RuntimeEnabledFeatures::weakMemoryCacheEnabled()) | |
| 74 m_resourceWeak = resource; | |
| 75 else | |
| 76 m_resource = resource; | |
| 77 } | |
| 78 | |
| 79 DEFINE_TRACE(MemoryCacheEntry) | 63 DEFINE_TRACE(MemoryCacheEntry) |
| 80 { | 64 { |
| 81 visitor->trace(m_resource); | 65 visitor->trace(m_resource); |
| 82 visitor->trace(m_resourceWeak); | |
| 83 visitor->trace(m_previousInLiveResourcesList); | 66 visitor->trace(m_previousInLiveResourcesList); |
| 84 visitor->trace(m_nextInLiveResourcesList); | 67 visitor->trace(m_nextInLiveResourcesList); |
| 85 visitor->trace(m_previousInAllResourcesList); | 68 visitor->trace(m_previousInAllResourcesList); |
| 86 visitor->trace(m_nextInAllResourcesList); | 69 visitor->trace(m_nextInAllResourcesList); |
| 87 } | 70 } |
| 88 | 71 |
| 89 void MemoryCacheEntry::dispose() | 72 void MemoryCacheEntry::dispose() |
| 90 { | 73 { |
| 91 m_resource.clear(); | 74 m_resource.clear(); |
| 92 m_resourceWeak.clear(); | |
| 93 } | 75 } |
| 94 | 76 |
| 95 Resource* MemoryCacheEntry::resource() | 77 Resource* MemoryCacheEntry::resource() |
| 96 { | 78 { |
| 97 if (RuntimeEnabledFeatures::weakMemoryCacheEnabled()) | |
| 98 return m_resourceWeak.get(); | |
| 99 return m_resource.get(); | 79 return m_resource.get(); |
| 100 } | 80 } |
| 101 | 81 |
| 102 DEFINE_TRACE(MemoryCacheLRUList) | 82 DEFINE_TRACE(MemoryCacheLRUList) |
| 103 { | 83 { |
| 104 visitor->trace(m_head); | 84 visitor->trace(m_head); |
| 105 visitor->trace(m_tail); | 85 visitor->trace(m_tail); |
| 106 } | 86 } |
| 107 | 87 |
| 108 inline MemoryCache::MemoryCache() | 88 inline MemoryCache::MemoryCache() |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 176 } | 156 } |
| 177 return m_resourceMaps.get(cacheIdentifier); | 157 return m_resourceMaps.get(cacheIdentifier); |
| 178 } | 158 } |
| 179 | 159 |
| 180 void MemoryCache::add(Resource* resource) | 160 void MemoryCache::add(Resource* resource) |
| 181 { | 161 { |
| 182 ASSERT(WTF::isMainThread()); | 162 ASSERT(WTF::isMainThread()); |
| 183 ASSERT(resource->url().isValid()); | 163 ASSERT(resource->url().isValid()); |
| 184 ResourceMap* resources = ensureResourceMap(resource->cacheIdentifier()); | 164 ResourceMap* resources = ensureResourceMap(resource->cacheIdentifier()); |
| 185 KURL url = removeFragmentIdentifierIfNeeded(resource->url()); | 165 KURL url = removeFragmentIdentifierIfNeeded(resource->url()); |
| 186 RELEASE_ASSERT(!contains(resource)); | 166 RELEASE_ASSERT(!resources->contains(url)); |
| 187 resources->set(url, MemoryCacheEntry::create(resource)); | 167 resources->set(url, MemoryCacheEntry::create(resource)); |
| 188 update(resource, 0, resource->size(), true); | 168 update(resource, 0, resource->size(), true); |
| 189 | 169 |
| 190 WTF_LOG(ResourceLoading, "MemoryCache::add Added '%s', resource %p\n", resou
rce->url().getString().latin1().data(), resource); | 170 WTF_LOG(ResourceLoading, "MemoryCache::add Added '%s', resource %p\n", resou
rce->url().getString().latin1().data(), resource); |
| 191 } | 171 } |
| 192 | 172 |
| 193 void MemoryCache::remove(Resource* resource) | 173 void MemoryCache::remove(Resource* resource) |
| 194 { | 174 { |
| 195 // The resource may have already been removed by someone other than our call
er, | 175 // The resource may have already been removed by someone other than our call
er, |
| 196 // who needed a fresh copy for a reload. | 176 // who needed a fresh copy for a reload. |
| (...skipping 29 matching lines...) Expand all Loading... |
| 226 return nullptr; | 206 return nullptr; |
| 227 return resource; | 207 return resource; |
| 228 } | 208 } |
| 229 | 209 |
| 230 HeapVector<Member<Resource>> MemoryCache::resourcesForURL(const KURL& resourceUR
L) | 210 HeapVector<Member<Resource>> MemoryCache::resourcesForURL(const KURL& resourceUR
L) |
| 231 { | 211 { |
| 232 ASSERT(WTF::isMainThread()); | 212 ASSERT(WTF::isMainThread()); |
| 233 KURL url = removeFragmentIdentifierIfNeeded(resourceURL); | 213 KURL url = removeFragmentIdentifierIfNeeded(resourceURL); |
| 234 HeapVector<Member<Resource>> results; | 214 HeapVector<Member<Resource>> results; |
| 235 for (const auto& resourceMapIter : m_resourceMaps) { | 215 for (const auto& resourceMapIter : m_resourceMaps) { |
| 236 if (MemoryCacheEntry* entry = resourceMapIter.value->get(url)) { | 216 if (MemoryCacheEntry* entry = resourceMapIter.value->get(url)) |
| 237 Resource* resource = entry->resource(); | 217 results.append(entry->resource()); |
| 238 if (resource) | |
| 239 results.append(resource); | |
| 240 } | |
| 241 } | 218 } |
| 242 return results; | 219 return results; |
| 243 } | 220 } |
| 244 | 221 |
| 245 size_t MemoryCache::deadCapacity() const | 222 size_t MemoryCache::deadCapacity() const |
| 246 { | 223 { |
| 247 // Dead resource capacity is whatever space is not occupied by live resource
s, bounded by an independent minimum and maximum. | 224 // Dead resource capacity is whatever space is not occupied by live resource
s, bounded by an independent minimum and maximum. |
| 248 size_t capacity = m_capacity - std::min(m_liveSize, m_capacity); // Start wi
th available capacity. | 225 size_t capacity = m_capacity - std::min(m_liveSize, m_capacity); // Start wi
th available capacity. |
| 249 capacity = std::max(capacity, m_minDeadCapacity); // Make sure it's above th
e minimum. | 226 capacity = std::max(capacity, m_minDeadCapacity); // Make sure it's above th
e minimum. |
| 250 capacity = std::min(capacity, m_maxDeadCapacity); // Make sure it's below th
e maximum. | 227 capacity = std::min(capacity, m_maxDeadCapacity); // Make sure it's below th
e maximum. |
| (...skipping 24 matching lines...) Expand all Loading... |
| 275 // The list might not be sorted by the m_lastDecodedFrameTimeStamp. The impa
ct | 252 // The list might not be sorted by the m_lastDecodedFrameTimeStamp. The impa
ct |
| 276 // of this weaker invariant is minor as the below if statement to check the | 253 // of this weaker invariant is minor as the below if statement to check the |
| 277 // elapsedTime will evaluate to false as the current time will be a lot | 254 // elapsedTime will evaluate to false as the current time will be a lot |
| 278 // greater than the current->m_lastDecodedFrameTimeStamp. | 255 // greater than the current->m_lastDecodedFrameTimeStamp. |
| 279 // For more details see: https://bugs.webkit.org/show_bug.cgi?id=30209 | 256 // For more details see: https://bugs.webkit.org/show_bug.cgi?id=30209 |
| 280 | 257 |
| 281 MemoryCacheEntry* current = m_liveDecodedResources.m_tail; | 258 MemoryCacheEntry* current = m_liveDecodedResources.m_tail; |
| 282 while (current) { | 259 while (current) { |
| 283 Resource* resource = current->resource(); | 260 Resource* resource = current->resource(); |
| 284 MemoryCacheEntry* previous = current->m_previousInLiveResourcesList; | 261 MemoryCacheEntry* previous = current->m_previousInLiveResourcesList; |
| 285 if (!resource) { | |
| 286 current = previous; | |
| 287 continue; | |
| 288 } | |
| 289 ASSERT(resource->hasClientsOrObservers()); | 262 ASSERT(resource->hasClientsOrObservers()); |
| 290 | 263 |
| 291 if (resource->isLoaded() && resource->decodedSize()) { | 264 if (resource->isLoaded() && resource->decodedSize()) { |
| 292 // Check to see if the remaining resources are too new to prune. | 265 // Check to see if the remaining resources are too new to prune. |
| 293 double elapsedTime = m_pruneFrameTimeStamp - current->m_lastDecodedA
ccessTime; | 266 double elapsedTime = m_pruneFrameTimeStamp - current->m_lastDecodedA
ccessTime; |
| 294 if (strategy == AutomaticPrune && elapsedTime < m_delayBeforeLiveDec
odedPrune) | 267 if (strategy == AutomaticPrune && elapsedTime < m_delayBeforeLiveDec
odedPrune) |
| 295 return; | 268 return; |
| 296 | 269 |
| 297 // Destroy our decoded data if possible. This will remove us | 270 // Destroy our decoded data if possible. This will remove us |
| 298 // from m_liveDecodedResources, and possibly move us to a | 271 // from m_liveDecodedResources, and possibly move us to a |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 385 m_maxDeferredPruneDeadCapacity = cDeferredPruneDeadCapacityFactor * maxDeadB
ytes; | 358 m_maxDeferredPruneDeadCapacity = cDeferredPruneDeadCapacityFactor * maxDeadB
ytes; |
| 386 m_capacity = totalBytes; | 359 m_capacity = totalBytes; |
| 387 prune(); | 360 prune(); |
| 388 } | 361 } |
| 389 | 362 |
| 390 void MemoryCache::evict(MemoryCacheEntry* entry) | 363 void MemoryCache::evict(MemoryCacheEntry* entry) |
| 391 { | 364 { |
| 392 ASSERT(WTF::isMainThread()); | 365 ASSERT(WTF::isMainThread()); |
| 393 | 366 |
| 394 Resource* resource = entry->resource(); | 367 Resource* resource = entry->resource(); |
| 395 DCHECK(resource); | |
| 396 WTF_LOG(ResourceLoading, "Evicting resource %p for '%s' from cache", resourc
e, resource->url().getString().latin1().data()); | 368 WTF_LOG(ResourceLoading, "Evicting resource %p for '%s' from cache", resourc
e, resource->url().getString().latin1().data()); |
| 397 // The resource may have already been removed by someone other than our call
er, | 369 // The resource may have already been removed by someone other than our call
er, |
| 398 // who needed a fresh copy for a reload. See <http://bugs.webkit.org/show_bu
g.cgi?id=12479#c6>. | 370 // who needed a fresh copy for a reload. See <http://bugs.webkit.org/show_bu
g.cgi?id=12479#c6>. |
| 399 update(resource, resource->size(), 0, false); | 371 update(resource, resource->size(), 0, false); |
| 400 removeFromLiveDecodedResourcesList(entry); | 372 removeFromLiveDecodedResourcesList(entry); |
| 401 | 373 |
| 402 ResourceMap* resources = m_resourceMaps.get(resource->cacheIdentifier()); | 374 ResourceMap* resources = m_resourceMaps.get(resource->cacheIdentifier()); |
| 403 ASSERT(resources); | 375 ASSERT(resources); |
| 404 KURL url = removeFragmentIdentifierIfNeeded(resource->url()); | 376 KURL url = removeFragmentIdentifierIfNeeded(resource->url()); |
| 405 ResourceMap::iterator it = resources->find(url); | 377 ResourceMap::iterator it = resources->find(url); |
| 406 ASSERT(it != resources->end()); | 378 ASSERT(it != resources->end()); |
| 407 | 379 |
| 408 MemoryCacheEntry* entryPtr = it->value; | 380 MemoryCacheEntry* entryPtr = it->value; |
| 409 resources->remove(it); | 381 resources->remove(it); |
| 410 if (entryPtr) | 382 if (entryPtr) |
| 411 entryPtr->dispose(); | 383 entryPtr->dispose(); |
| 412 } | 384 } |
| 413 | 385 |
| 414 MemoryCacheEntry* MemoryCache::getEntryForResource(const Resource* resource) con
st | 386 MemoryCacheEntry* MemoryCache::getEntryForResource(const Resource* resource) con
st |
| 415 { | 387 { |
| 416 if (!resource || resource->url().isNull() || resource->url().isEmpty()) | 388 if (resource->url().isNull() || resource->url().isEmpty()) |
| 417 return nullptr; | 389 return nullptr; |
| 418 ResourceMap* resources = m_resourceMaps.get(resource->cacheIdentifier()); | 390 ResourceMap* resources = m_resourceMaps.get(resource->cacheIdentifier()); |
| 419 if (!resources) | 391 if (!resources) |
| 420 return nullptr; | 392 return nullptr; |
| 421 KURL url = removeFragmentIdentifierIfNeeded(resource->url()); | 393 KURL url = removeFragmentIdentifierIfNeeded(resource->url()); |
| 422 MemoryCacheEntry* entry = resources->get(url); | 394 MemoryCacheEntry* entry = resources->get(url); |
| 423 if (!entry || entry->resource() != resource) | 395 if (!entry || entry->resource() != resource) |
| 424 return nullptr; | 396 return nullptr; |
| 425 return entry; | 397 return entry; |
| 426 } | 398 } |
| (...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 619 encodedSizeDuplicatedInDataURLs += o->url().protocolIsData() ? o->encodedSiz
e() : 0; | 591 encodedSizeDuplicatedInDataURLs += o->url().protocolIsData() ? o->encodedSiz
e() : 0; |
| 620 purgeableSize += purgeable ? pageSize : 0; | 592 purgeableSize += purgeable ? pageSize : 0; |
| 621 } | 593 } |
| 622 | 594 |
| 623 MemoryCache::Statistics MemoryCache::getStatistics() | 595 MemoryCache::Statistics MemoryCache::getStatistics() |
| 624 { | 596 { |
| 625 Statistics stats; | 597 Statistics stats; |
| 626 for (const auto& resourceMapIter : m_resourceMaps) { | 598 for (const auto& resourceMapIter : m_resourceMaps) { |
| 627 for (const auto& resourceIter : *resourceMapIter.value) { | 599 for (const auto& resourceIter : *resourceMapIter.value) { |
| 628 Resource* resource = resourceIter.value->resource(); | 600 Resource* resource = resourceIter.value->resource(); |
| 629 if (!resource) | |
| 630 continue; | |
| 631 switch (resource->getType()) { | 601 switch (resource->getType()) { |
| 632 case Resource::Image: | 602 case Resource::Image: |
| 633 stats.images.addResource(resource); | 603 stats.images.addResource(resource); |
| 634 break; | 604 break; |
| 635 case Resource::CSSStyleSheet: | 605 case Resource::CSSStyleSheet: |
| 636 stats.cssStyleSheets.addResource(resource); | 606 stats.cssStyleSheets.addResource(resource); |
| 637 break; | 607 break; |
| 638 case Resource::Script: | 608 case Resource::Script: |
| 639 stats.scripts.addResource(resource); | 609 stats.scripts.addResource(resource); |
| 640 break; | 610 break; |
| (...skipping 16 matching lines...) Expand all Loading... |
| 657 { | 627 { |
| 658 while (true) { | 628 while (true) { |
| 659 ResourceMapIndex::iterator resourceMapIter = m_resourceMaps.begin(); | 629 ResourceMapIndex::iterator resourceMapIter = m_resourceMaps.begin(); |
| 660 if (resourceMapIter == m_resourceMaps.end()) | 630 if (resourceMapIter == m_resourceMaps.end()) |
| 661 break; | 631 break; |
| 662 ResourceMap* resources = resourceMapIter->value.get(); | 632 ResourceMap* resources = resourceMapIter->value.get(); |
| 663 while (true) { | 633 while (true) { |
| 664 ResourceMap::iterator resourceIter = resources->begin(); | 634 ResourceMap::iterator resourceIter = resources->begin(); |
| 665 if (resourceIter == resources->end()) | 635 if (resourceIter == resources->end()) |
| 666 break; | 636 break; |
| 667 if (resourceIter->value->resource()) | 637 evict(resourceIter->value.get()); |
| 668 evict(resourceIter->value.get()); | |
| 669 else | |
| 670 resources->remove(resourceIter); | |
| 671 } | 638 } |
| 672 m_resourceMaps.remove(resourceMapIter); | 639 m_resourceMaps.remove(resourceMapIter); |
| 673 } | 640 } |
| 674 } | 641 } |
| 675 | 642 |
| 676 void MemoryCache::prune(Resource* justReleasedResource) | 643 void MemoryCache::prune(Resource* justReleasedResource) |
| 677 { | 644 { |
| 678 TRACE_EVENT0("renderer", "MemoryCache::prune()"); | 645 TRACE_EVENT0("renderer", "MemoryCache::prune()"); |
| 679 | 646 |
| 680 if (m_inPruneResources) | 647 if (m_inPruneResources) |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 754 void MemoryCache::updateFramePaintTimestamp() | 721 void MemoryCache::updateFramePaintTimestamp() |
| 755 { | 722 { |
| 756 m_lastFramePaintTimeStamp = currentTime(); | 723 m_lastFramePaintTimeStamp = currentTime(); |
| 757 } | 724 } |
| 758 | 725 |
| 759 bool MemoryCache::onMemoryDump(WebMemoryDumpLevelOfDetail levelOfDetail, WebProc
essMemoryDump* memoryDump) | 726 bool MemoryCache::onMemoryDump(WebMemoryDumpLevelOfDetail levelOfDetail, WebProc
essMemoryDump* memoryDump) |
| 760 { | 727 { |
| 761 for (const auto& resourceMapIter : m_resourceMaps) { | 728 for (const auto& resourceMapIter : m_resourceMaps) { |
| 762 for (const auto& resourceIter : *resourceMapIter.value) { | 729 for (const auto& resourceIter : *resourceMapIter.value) { |
| 763 Resource* resource = resourceIter.value->resource(); | 730 Resource* resource = resourceIter.value->resource(); |
| 764 if (resource) | 731 resource->onMemoryDump(levelOfDetail, memoryDump); |
| 765 resource->onMemoryDump(levelOfDetail, memoryDump); | |
| 766 } | 732 } |
| 767 } | 733 } |
| 768 return true; | 734 return true; |
| 769 } | 735 } |
| 770 | 736 |
| 771 bool MemoryCache::isInSameLRUListForTest(const Resource* x, const Resource* y) | 737 bool MemoryCache::isInSameLRUListForTest(const Resource* x, const Resource* y) |
| 772 { | 738 { |
| 773 MemoryCacheEntry* ex = getEntryForResource(x); | 739 MemoryCacheEntry* ex = getEntryForResource(x); |
| 774 MemoryCacheEntry* ey = getEntryForResource(y); | 740 MemoryCacheEntry* ey = getEntryForResource(y); |
| 775 ASSERT(ex); | 741 ASSERT(ex); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 804 void MemoryCache::dumpLRULists(bool includeLive) const | 770 void MemoryCache::dumpLRULists(bool includeLive) const |
| 805 { | 771 { |
| 806 printf("LRU-SP lists in eviction order (Kilobytes decoded, Kilobytes encoded
, Access count, Referenced, isPurgeable):\n"); | 772 printf("LRU-SP lists in eviction order (Kilobytes decoded, Kilobytes encoded
, Access count, Referenced, isPurgeable):\n"); |
| 807 | 773 |
| 808 int size = m_allResources.size(); | 774 int size = m_allResources.size(); |
| 809 for (int i = size - 1; i >= 0; i--) { | 775 for (int i = size - 1; i >= 0; i--) { |
| 810 printf("\n\nList %d: ", i); | 776 printf("\n\nList %d: ", i); |
| 811 MemoryCacheEntry* current = m_allResources[i].m_tail; | 777 MemoryCacheEntry* current = m_allResources[i].m_tail; |
| 812 while (current) { | 778 while (current) { |
| 813 Resource* currentResource = current->resource(); | 779 Resource* currentResource = current->resource(); |
| 814 if (currentResource && (includeLive || !currentResource->hasClientsO
rObservers())) | 780 if (includeLive || !currentResource->hasClientsOrObservers()) |
| 815 printf("(%.1fK, %.1fK, %uA, %dR, %d); ", currentResource->decode
dSize() / 1024.0f, (currentResource->encodedSize() + currentResource->overheadSi
ze()) / 1024.0f, current->m_accessCount, currentResource->hasClientsOrObservers(
), currentResource->isPurgeable()); | 781 printf("(%.1fK, %.1fK, %uA, %dR, %d); ", currentResource->decode
dSize() / 1024.0f, (currentResource->encodedSize() + currentResource->overheadSi
ze()) / 1024.0f, current->m_accessCount, currentResource->hasClientsOrObservers(
), currentResource->isPurgeable()); |
| 816 | 782 |
| 817 current = current->m_previousInAllResourcesList; | 783 current = current->m_previousInAllResourcesList; |
| 818 } | 784 } |
| 819 } | 785 } |
| 820 } | 786 } |
| 821 | 787 |
| 822 #endif // MEMORY_CACHE_STATS | 788 #endif // MEMORY_CACHE_STATS |
| 823 | 789 |
| 824 } // namespace blink | 790 } // namespace blink |
| OLD | NEW |