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