18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Copyright (C) 1998 Lars Knoll (knoll@mpi-hd.mpg.de) 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Copyright (C) 2001 Dirk Mueller <mueller@kde.org> 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project This library is free software; you can redistribute it and/or 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project modify it under the terms of the GNU Library General Public 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project License as published by the Free Software Foundation; either 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project version 2 of the License, or (at your option) any later version. 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project This library is distributed in the hope that it will be useful, 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project but WITHOUT ANY WARRANTY; without even the implied warranty of 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Library General Public License for more details. 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project You should have received a copy of the GNU Library General Public License 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project along with this library; see the file COPYING.LIB. If not, write to 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Boston, MA 02110-1301, USA. 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project This class provides all functionality needed for loading images, style sheets and html 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project pages from the web. It has a memory cache for these objects. 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*/ 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef Cache_h 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define Cache_h 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CachePolicy.h" 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CachedResource.h" 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PlatformString.h" 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/HashMap.h> 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/HashSet.h> 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/Noncopyable.h> 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/Vector.h> 35f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick#include <wtf/text/StringHash.h> 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore { 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass CachedCSSStyleSheet; 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass CachedResource; 415abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickclass CachedResourceLoader; 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass KURL; 4381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochclass SecurityOrigin; 4481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochstruct SecurityOriginHash; 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This cache holds subresources used by Web pages: images, scripts, stylesheets, etc. 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// The cache keeps a flexible but bounded window of dead resources that grows/shrinks 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// depending on the live resource load. Here's an example of cache growth over time, 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// with a min dead resource capacity of 25% and a max dead resource capacity of 50%: 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// |-----| Dead: - 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// |----------| Live: + 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// --|----------| Cache boundary: | (objects outside this mark have been evicted) 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// --|----------++++++++++| 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// -------|-----+++++++++++++++| 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// -------|-----+++++++++++++++|+++++ 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 59bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen// The behavior of the cache changes in the following way if shouldMakeResourcePurgeableOnEviction 60bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen// returns true. 61bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen// 62bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen// 1. Dead resources in the cache are kept in non-purgeable memory. 63bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen// 2. When we prune dead resources, instead of freeing them, we mark their memory as purgeable and 64bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen// keep the resources until the kernel reclaims the purgeable memory. 65bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen// 66bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen// By leaving the in-cache dead resources in dirty resident memory, we decrease the likelihood of 67bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen// the kernel claiming that memory and forcing us to refetch the resource (for example when a user 68bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen// presses back). 69bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen// 70bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen// And by having an unbounded number of resource objects using purgeable memory, we can use as much 71bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen// memory as is available on the machine. The trade-off here is that the CachedResource object (and 72bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen// its member variables) are allocated in non-purgeable TC-malloc'd memory so we would see slightly 73bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen// more memory use due to this. 74bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 75ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochclass MemoryCache { 76ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch WTF_MAKE_NONCOPYABLE(MemoryCache); WTF_MAKE_FAST_ALLOCATED; 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectpublic: 7865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch friend MemoryCache* memoryCache(); 798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project typedef HashMap<String, CachedResource*> CachedResourceMap; 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project struct LRUList { 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CachedResource* m_head; 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CachedResource* m_tail; 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LRUList() : m_head(0), m_tail(0) { } 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project }; 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project struct TypeStatistic { 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int count; 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int size; 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int liveSize; 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int decodedSize; 93635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int purgeableSize; 94635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int purgedSize; 95635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project TypeStatistic() : count(0), size(0), liveSize(0), decodedSize(0), purgeableSize(0), purgedSize(0) { } 96635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project void addResource(CachedResource*); 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project }; 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project struct Statistics { 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project TypeStatistic images; 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project TypeStatistic cssStyleSheets; 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project TypeStatistic scripts; 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(XSLT) 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project TypeStatistic xslStyleSheets; 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project TypeStatistic fonts; 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project }; 108f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 109cad810f21b803229eb11403f9209855525a25d57Steve Block CachedResource* resourceForURL(const KURL&); 110cad810f21b803229eb11403f9209855525a25d57Steve Block 111cad810f21b803229eb11403f9209855525a25d57Steve Block bool add(CachedResource* resource); 112cad810f21b803229eb11403f9209855525a25d57Steve Block void remove(CachedResource* resource) { evict(resource); } 113cad810f21b803229eb11403f9209855525a25d57Steve Block 114f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch static KURL removeFragmentIdentifierIfNeeded(const KURL& originalURL); 1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void revalidationSucceeded(CachedResource* revalidatingResource, const ResourceResponse&); 1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void revalidationFailed(CachedResource* revalidatingResource); 1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Sets the cache's memory capacities, in bytes. These will hold only approximately, 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // since the decoded cost of resources like scripts and stylesheets is not known. 1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // - minDeadBytes: The maximum number of bytes that dead resources should consume when the cache is under pressure. 1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // - maxDeadBytes: The maximum number of bytes that dead resources should consume when the cache is not under pressure. 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // - totalBytes: The maximum number of bytes that the cache should consume overall. 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void setCapacities(unsigned minDeadBytes, unsigned maxDeadBytes, unsigned totalBytes); 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Turn the cache on and off. Disabling the cache will remove all resources from the cache. They may 1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // still live on if they are referenced by some Web page though. 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void setDisabled(bool); 1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool disabled() const { return m_disabled; } 13081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 13181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch void evictResources(); 1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void setPruneEnabled(bool enabled) { m_pruneEnabled = enabled; } 1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void prune() 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_liveSize + m_deadSize <= m_capacity && m_maxDeadCapacity && m_deadSize <= m_maxDeadCapacity) // Fast path. 1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project pruneDeadResources(); // Prune dead first, in case it was "borrowing" capacity from live. 1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project pruneLiveResources(); 1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void setDeadDecodedDataDeletionInterval(double interval) { m_deadDecodedDataDeletionInterval = interval; } 1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project double deadDecodedDataDeletionInterval() const { return m_deadDecodedDataDeletionInterval; } 1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1465abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick void addCachedResourceLoader(CachedResourceLoader*); 1475abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick void removeCachedResourceLoader(CachedResourceLoader*); 1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Calls to put the cached resource into and out of LRU lists. 1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void insertInLRUList(CachedResource*); 1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void removeFromLRUList(CachedResource*); 1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Called to adjust the cache totals when a resource changes size. 1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void adjustSize(bool live, int delta); 1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Track decoded resources that are in the cache and referenced by a Web page. 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void insertInLiveDecodedResourcesList(CachedResource*); 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void removeFromLiveDecodedResourcesList(CachedResource*); 1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void addToLiveResourcesSize(CachedResource*); 1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void removeFromLiveResourcesSize(CachedResource*); 1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 163bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen static bool shouldMakeResourcePurgeableOnEviction(); 164bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Function to collect cache statistics for the caches window in the Safari Debug menu. 1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Statistics getStatistics(); 167cad810f21b803229eb11403f9209855525a25d57Steve Block 168cad810f21b803229eb11403f9209855525a25d57Steve Block void resourceAccessed(CachedResource*); 1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1709921f05212aa840e1ce32e9f04fa60ca4b3bcbb7Ben Murdoch typedef HashSet<RefPtr<SecurityOrigin>, SecurityOriginHash> SecurityOriginSet; 1719921f05212aa840e1ce32e9f04fa60ca4b3bcbb7Ben Murdoch void removeResourcesWithOrigin(SecurityOrigin*); 1729921f05212aa840e1ce32e9f04fa60ca4b3bcbb7Ben Murdoch void getOriginsWithCache(SecurityOriginSet& origins); 1739921f05212aa840e1ce32e9f04fa60ca4b3bcbb7Ben Murdoch 1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprivate: 17528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu MemoryCache(); 17628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu ~MemoryCache(); // Not implemented to make sure nobody accidentally calls delete -- WebCore does not delete singletons. 1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LRUList* lruListFor(CachedResource*); 1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG 180635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project void dumpStats(); 1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void dumpLRULists(bool includeLive) const; 1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned liveCapacity() const; 1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned deadCapacity() const; 1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void pruneDeadResources(); // Flush decoded and encoded data from resources not referenced by Web pages. 1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void pruneLiveResources(); // Flush decoded data from resources still referenced by Web pages. 1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 190bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen bool makeResourcePurgeable(CachedResource*); 1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void evict(CachedResource*); 1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool m_disabled; // Whether or not the cache is enabled. 1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool m_pruneEnabled; 1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool m_inPruneDeadResources; 1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned m_capacity; 1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned m_minDeadCapacity; 1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned m_maxDeadCapacity; 2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project double m_deadDecodedDataDeletionInterval; 2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned m_liveSize; // The number of bytes currently consumed by "live" resources in the cache. 2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned m_deadSize; // The number of bytes currently consumed by "dead" resources in the cache. 2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Size-adjusted and popularity-aware LRU list collection for cache objects. This collection can hold 206d0825bca7fe65beaee391d30da42e937db621564Steve Block // more resources than the cached resource map, since it can also hold "stale" multiple versions of objects that are 2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // waiting to die when the clients referencing them go away. 2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Vector<LRUList, 32> m_allResources; 2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // List just for live resources with decoded data. Access to this list is based off of painting the resource. 2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LRUList m_liveDecodedResources; 2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // A URL-based map of all resources that are in the cache (including the freshest version of objects that are currently being 2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // referenced by a Web page). 2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HashMap<String, CachedResource*> m_resources; 2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}; 2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhuinline bool MemoryCache::shouldMakeResourcePurgeableOnEviction() 219bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{ 220bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#if PLATFORM(IOS) 221bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return true; 222bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#else 223bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return false; 224bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#endif 225bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen} 226bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Function to obtain the global cache. 22865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochMemoryCache* memoryCache(); 2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 233