15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Copyright (C) 1998 Lars Knoll (knoll@mpi-hd.mpg.de)
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Copyright (C) 2001 Dirk Mueller <mueller@kde.org>
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    This library is free software; you can redistribute it and/or
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    modify it under the terms of the GNU Library General Public
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    License as published by the Free Software Foundation; either
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    version 2 of the License, or (at your option) any later version.
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    This library is distributed in the hope that it will be useful,
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    but WITHOUT ANY WARRANTY; without even the implied warranty of
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Library General Public License for more details.
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    You should have received a copy of the GNU Library General Public License
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    along with this library; see the file COPYING.LIB.  If not, write to
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Boston, MA 02110-1301, USA.
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    This class provides all functionality needed for loading images, style sheets and html
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    pages from the web. It has a memory cache for these objects.
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)*/
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#ifndef MemoryCache_h
26e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#define MemoryCache_h
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "core/fetch/Resource.h"
2909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/fetch/ResourcePtr.h"
30e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "public/platform/WebThread.h"
31591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/HashMap.h"
32591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/Noncopyable.h"
33591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/Vector.h"
34591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/text/StringHash.h"
35591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/text/WTFString.h"
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink  {
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
393c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdochclass CSSStyleSheetResource;
40fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdochclass Resource;
413464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdochclass ResourceFetcher;
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class KURL;
431e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)class ExecutionContext;
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class SecurityOrigin;
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)struct SecurityOriginHash;
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// This cache holds subresources used by Web pages: images, scripts, stylesheets, etc.
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch// The cache keeps a flexible but bounded window of dead resources that grows/shrinks
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// depending on the live resource load. Here's an example of cache growth over time,
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// with a min dead resource capacity of 25% and a max dead resource capacity of 50%:
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//        |-----|                              Dead: -
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//        |----------|                         Live: +
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//      --|----------|                         Cache boundary: | (objects outside this mark have been evicted)
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//      --|----------++++++++++|
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// -------|-----+++++++++++++++|
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// -------|-----+++++++++++++++|+++++
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
605267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)// Enable this macro to periodically log information about the memory cache.
615267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#undef MEMORY_CACHE_STATS
625267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
63a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch// Determines the order in which CachedResources are evicted
64a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch// from the decoded resources cache.
65a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdochenum MemoryCacheLiveResourcePriority {
66a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    MemoryCacheLiveResourcePriorityLow = 0,
67a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    MemoryCacheLiveResourcePriorityHigh,
68a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    MemoryCacheLiveResourcePriorityUnknown
69a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch};
70a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
71a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdochenum UpdateReason {
72a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    UpdateForAccess,
73a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    UpdateForPropertyChange
74a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch};
75a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
76c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)// MemoryCacheEntry class is used only in MemoryCache class, but we don't make
77c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)// MemoryCacheEntry class an inner class of MemoryCache because of dependency
78c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)// from MemoryCacheLRUList.
79c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)class MemoryCacheEntry FINAL : public NoBaseWillBeGarbageCollectedFinalized<MemoryCacheEntry> {
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
81c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    static PassOwnPtrWillBeRawPtr<MemoryCacheEntry> create(Resource* resource) { return adoptPtrWillBeNoop(new MemoryCacheEntry(resource)); }
82c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    void trace(Visitor*);
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
84c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    ResourcePtr<Resource> m_resource;
85c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    bool m_inLiveDecodedResourcesList;
86c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    unsigned m_accessCount;
87c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    MemoryCacheLiveResourcePriority m_liveResourcePriority;
88c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    double m_lastDecodedAccessTime; // Used as a thrash guard
89c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
90c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    RawPtrWillBeMember<MemoryCacheEntry> m_previousInLiveResourcesList;
91c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    RawPtrWillBeMember<MemoryCacheEntry> m_nextInLiveResourcesList;
92c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    RawPtrWillBeMember<MemoryCacheEntry> m_previousInAllResourcesList;
93c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    RawPtrWillBeMember<MemoryCacheEntry> m_nextInAllResourcesList;
94c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
95c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)private:
96c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    explicit MemoryCacheEntry(Resource* resource)
97c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        : m_resource(resource)
98c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        , m_inLiveDecodedResourcesList(false)
99c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        , m_accessCount(0)
100c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        , m_liveResourcePriority(MemoryCacheLiveResourcePriorityLow)
101c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        , m_lastDecodedAccessTime(0.0)
102c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        , m_previousInLiveResourcesList(nullptr)
103c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        , m_nextInLiveResourcesList(nullptr)
104c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        , m_previousInAllResourcesList(nullptr)
105c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        , m_nextInAllResourcesList(nullptr)
106c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
107c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
108c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)};
109c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
110c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)// MemoryCacheLRUList is used only in MemoryCache class, but we don't make
111c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)// MemoryCacheLRUList an inner struct of MemoryCache because we can't define
112c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)// VectorTraits for inner structs.
113c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)struct MemoryCacheLRUList FINAL {
114c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    ALLOW_ONLY_INLINE_ALLOCATION();
115c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)public:
116c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    RawPtrWillBeMember<MemoryCacheEntry> m_head;
117c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    RawPtrWillBeMember<MemoryCacheEntry> m_tail;
118c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
119c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    MemoryCacheLRUList() : m_head(nullptr), m_tail(nullptr) { }
120c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    void trace(Visitor*);
121c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)};
122c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
123c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
124c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
125c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)WTF_ALLOW_MOVE_INIT_AND_COMPARE_WITH_MEM_FUNCTIONS(blink::MemoryCacheLRUList);
126c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
127c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
128c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
129c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)class MemoryCache FINAL : public NoBaseWillBeGarbageCollectedFinalized<MemoryCache>, public WebThread::TaskObserver {
130c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    WTF_MAKE_NONCOPYABLE(MemoryCache); WTF_MAKE_FAST_ALLOCATED_WILL_BE_REMOVED;
131c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)public:
132c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    static PassOwnPtrWillBeRawPtr<MemoryCache> create();
133c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    ~MemoryCache();
134c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    void trace(Visitor*);
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    struct TypeStatistic {
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        int count;
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        int size;
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        int liveSize;
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        int decodedSize;
1415267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        int encodedSize;
1425267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        int encodedSizeDuplicatedInDataURLs;
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        int purgeableSize;
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        int purgedSize;
1455267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
1465267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        TypeStatistic()
1475267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            : count(0)
1485267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            , size(0)
1495267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            , liveSize(0)
1505267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            , decodedSize(0)
1515267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            , encodedSize(0)
1525267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            , encodedSizeDuplicatedInDataURLs(0)
1535267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            , purgeableSize(0)
1545267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            , purgedSize(0)
1555267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        {
1565267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        }
1575267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
158fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch        void addResource(Resource*);
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
1605267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    struct Statistics {
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        TypeStatistic images;
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        TypeStatistic cssStyleSheets;
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        TypeStatistic scripts;
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        TypeStatistic xslStyleSheets;
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        TypeStatistic fonts;
167521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        TypeStatistic other;
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
1695267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
170fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    Resource* resourceForURL(const KURL&);
17102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
172fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    void add(Resource*);
173fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    void replace(Resource* newResource, Resource* oldResource);
17407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    void remove(Resource*);
17507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    bool contains(const Resource*) const;
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static KURL removeFragmentIdentifierIfNeeded(const KURL& originalURL);
17802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
17902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    // Sets the cache's memory capacities, in bytes. These will hold only approximately,
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // since the decoded cost of resources like scripts and stylesheets is not known.
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //  - minDeadBytes: The maximum number of bytes that dead resources should consume when the cache is under pressure.
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //  - maxDeadBytes: The maximum number of bytes that dead resources should consume when the cache is not under pressure.
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //  - totalBytes: The maximum number of bytes that the cache should consume overall.
18409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    void setCapacities(size_t minDeadBytes, size_t maxDeadBytes, size_t totalBytes);
185e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    void setDelayBeforeLiveDecodedPrune(double seconds) { m_delayBeforeLiveDecodedPrune = seconds; }
186e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    void setMaxPruneDeferralDelay(double seconds) { m_maxPruneDeferralDelay = seconds; }
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void evictResources();
18993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
190e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    void prune(Resource* justReleasedResource = 0);
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    // Called to adjust a resource's size, lru list position, and access count.
19307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    void update(Resource*, size_t oldSize, size_t newSize, bool wasAccessed = false);
19407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    void updateForAccess(Resource* resource) { update(resource, resource->size(), resource->size(), true); }
195a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    void updateDecodedResource(Resource*, UpdateReason, MemoryCacheLiveResourcePriority = MemoryCacheLiveResourcePriorityUnknown);
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
197a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    void makeLive(Resource*);
198a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    void makeDead(Resource*);
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
200c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    // This should be called when a Resource object is created.
201c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    void registerLiveResource(Resource&);
202c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    // This should be called when a Resource object becomes unnecesarry.
203c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    void unregisterLiveResource(Resource&);
204c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
2051e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    static void removeURLFromCache(ExecutionContext*, const KURL&);
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Statistics getStatistics();
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    size_t minDeadCapacity() const { return m_minDeadCapacity; }
21009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    size_t maxDeadCapacity() const { return m_maxDeadCapacity; }
21109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    size_t capacity() const { return m_capacity; }
21209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    size_t liveSize() const { return m_liveSize; }
21309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    size_t deadSize() const { return m_deadSize; }
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
215a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    // Exposed for testing
216a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    MemoryCacheLiveResourcePriority priority(Resource*) const;
217a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
218e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    // TaskObserver implementation
219e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    virtual void willProcessTask() OVERRIDE;
220e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    virtual void didProcessTask() OVERRIDE;
221e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
223c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    MemoryCache();
224c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
225c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    MemoryCacheLRUList* lruListFor(unsigned accessCount, size_t);
2265267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
2275267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#ifdef MEMORY_CACHE_STATS
2285267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    void dumpStats(Timer<MemoryCache>*);
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void dumpLRULists(bool includeLive) const;
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    // Calls to put the cached resource into and out of LRU lists.
233c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    void insertInLRUList(MemoryCacheEntry*, MemoryCacheLRUList*);
234c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    void removeFromLRUList(MemoryCacheEntry*, MemoryCacheLRUList*);
23507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
236a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    // Track decoded resources that are in the cache and referenced by a Web page.
237a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    void insertInLiveDecodedResourcesList(MemoryCacheEntry*);
238a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    void removeFromLiveDecodedResourcesList(MemoryCacheEntry*);
239a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
24009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    size_t liveCapacity() const;
24109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    size_t deadCapacity() const;
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
243e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    // pruneDeadResources() - Flush decoded and encoded data from resources not referenced by Web pages.
244e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    // pruneLiveResources() - Flush decoded data from resources still referenced by Web pages.
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void pruneDeadResources(); // Automatically decide how much to prune.
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void pruneLiveResources();
247e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    void pruneNow(double currentTime);
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    bool evict(MemoryCacheEntry*);
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2511e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    static void removeURLFromCacheInternal(ExecutionContext*, const KURL&);
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_inPruneResources;
254e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    bool m_prunePending;
255e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    double m_maxPruneDeferralDelay;
256e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    double m_pruneTimeStamp;
257e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    double m_pruneFrameTimeStamp;
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    size_t m_capacity;
26009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    size_t m_minDeadCapacity;
26109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    size_t m_maxDeadCapacity;
26209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    size_t m_maxDeferredPruneDeadCapacity;
263e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    double m_delayBeforeLiveDecodedPrune;
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    size_t m_liveSize; // The number of bytes currently consumed by "live" resources in the cache.
26609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    size_t m_deadSize; // The number of bytes currently consumed by "dead" resources in the cache.
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
268e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    // Size-adjusted and popularity-aware LRU list collection for cache objects. This collection can hold
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // more resources than the cached resource map, since it can also hold "stale" multiple versions of objects that are
2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // waiting to die when the clients referencing them go away.
271c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    WillBeHeapVector<MemoryCacheLRUList, 32> m_allResources;
27202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2731fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch    // Lists just for live resources with decoded data. Access to this list is based off of painting the resource.
2741fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch    // The lists are ordered by decode priority, with higher indices having higher priorities.
275c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    MemoryCacheLRUList m_liveDecodedResources[MemoryCacheLiveResourcePriorityHigh + 1];
27602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
27702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    // A URL-based map of all resources that are in the cache (including the freshest version of objects that are currently being
2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // referenced by a Web page).
279c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    typedef WillBeHeapHashMap<String, OwnPtrWillBeMember<MemoryCacheEntry> > ResourceMap;
28009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    ResourceMap m_resources;
2815267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
282c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#if ENABLE(OILPAN)
283c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    // Unlike m_allResources, m_liveResources is a set of Resource objects which
284c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    // should not be deleted. m_allResources only contains on-cache Resource
285c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    // objects.
286c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    // FIXME: Can we remove manual lifetime management of Resource and this?
287c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    HeapHashSet<Member<Resource> > m_liveResources;
288c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    friend RawPtr<MemoryCache> replaceMemoryCacheForTesting(RawPtr<MemoryCache>);
289c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#endif
290c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
291e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    friend class MemoryCacheTest;
2925267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#ifdef MEMORY_CACHE_STATS
2935267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    Timer<MemoryCache> m_statsTimer;
2945267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#endif
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
297521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)// Returns the global cache.
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)MemoryCache* memoryCache();
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
300c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)// Sets the global cache, used to swap in a test instance. Returns the old
301c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)// MemoryCache object.
302c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)PassOwnPtrWillBeRawPtr<MemoryCache> replaceMemoryCacheForTesting(PassOwnPtrWillBeRawPtr<MemoryCache>);
303521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
307