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) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. | 4 Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. |
5 | 5 |
6 This library is free software; you can redistribute it and/or | 6 This library is free software; you can redistribute it and/or |
7 modify it under the terms of the GNU Library General Public | 7 modify it under the terms of the GNU Library General Public |
8 License as published by the Free Software Foundation; either | 8 License as published by the Free Software Foundation; either |
9 version 2 of the License, or (at your option) any later version. | 9 version 2 of the License, or (at your option) any later version. |
10 | 10 |
11 This library is distributed in the hope that it will be useful, | 11 This library is distributed in the hope that it will be useful, |
12 but WITHOUT ANY WARRANTY; without even the implied warranty of | 12 but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
14 Library General Public License for more details. | 14 Library General Public License for more details. |
15 | 15 |
16 You should have received a copy of the GNU Library General Public License | 16 You should have received a copy of the GNU Library General Public License |
17 along with this library; see the file COPYING.LIB. If not, write to | 17 along with this library; see the file COPYING.LIB. If not, write to |
18 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | 18 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
19 Boston, MA 02110-1301, USA. | 19 Boston, MA 02110-1301, USA. |
20 | 20 |
21 This class provides all functionality needed for loading images, style sheet
s and html | 21 This class provides all functionality needed for loading images, style sheet
s and html |
22 pages from the web. It has a memory cache for these objects. | 22 pages from the web. It has a memory cache for these objects. |
23 */ | 23 */ |
24 | 24 |
25 #ifndef MemoryCache_h | 25 #ifndef MemoryCache_h |
26 #define MemoryCache_h | 26 #define MemoryCache_h |
27 | 27 |
28 #include "core/fetch/Resource.h" | 28 #include "core/fetch/Resource.h" |
| 29 #include "core/fetch/ResourcePtr.h" |
29 #include "public/platform/WebThread.h" | 30 #include "public/platform/WebThread.h" |
30 #include "wtf/HashMap.h" | 31 #include "wtf/HashMap.h" |
31 #include "wtf/Noncopyable.h" | 32 #include "wtf/Noncopyable.h" |
32 #include "wtf/Vector.h" | 33 #include "wtf/Vector.h" |
33 #include "wtf/text/StringHash.h" | 34 #include "wtf/text/StringHash.h" |
34 #include "wtf/text/WTFString.h" | 35 #include "wtf/text/WTFString.h" |
35 | 36 |
36 namespace WebCore { | 37 namespace WebCore { |
37 | 38 |
38 class CSSStyleSheetResource; | 39 class CSSStyleSheetResource; |
(...skipping 19 matching lines...) Expand all Loading... |
58 | 59 |
59 // Enable this macro to periodically log information about the memory cache. | 60 // Enable this macro to periodically log information about the memory cache. |
60 #undef MEMORY_CACHE_STATS | 61 #undef MEMORY_CACHE_STATS |
61 | 62 |
62 class MemoryCache FINAL : public blink::WebThread::TaskObserver { | 63 class MemoryCache FINAL : public blink::WebThread::TaskObserver { |
63 WTF_MAKE_NONCOPYABLE(MemoryCache); WTF_MAKE_FAST_ALLOCATED; | 64 WTF_MAKE_NONCOPYABLE(MemoryCache); WTF_MAKE_FAST_ALLOCATED; |
64 public: | 65 public: |
65 MemoryCache(); | 66 MemoryCache(); |
66 virtual ~MemoryCache(); | 67 virtual ~MemoryCache(); |
67 | 68 |
68 typedef HashMap<String, Resource*> ResourceMap; | 69 class MemoryCacheEntry { |
| 70 public: |
| 71 static PassOwnPtr<MemoryCacheEntry> create(Resource* resource) { return
adoptPtr(new MemoryCacheEntry(resource)); } |
| 72 |
| 73 ResourcePtr<Resource> m_resource; |
| 74 bool m_inLiveDecodedResourcesList; |
| 75 |
| 76 MemoryCacheEntry* m_previousInLiveResourcesList; |
| 77 MemoryCacheEntry* m_nextInLiveResourcesList; |
| 78 MemoryCacheEntry* m_previousInAllResourcesList; |
| 79 MemoryCacheEntry* m_nextInAllResourcesList; |
| 80 |
| 81 private: |
| 82 MemoryCacheEntry(Resource* resource) |
| 83 : m_resource(resource) |
| 84 , m_inLiveDecodedResourcesList(false) |
| 85 , m_previousInLiveResourcesList(0) |
| 86 , m_nextInLiveResourcesList(0) |
| 87 , m_previousInAllResourcesList(0) |
| 88 , m_nextInAllResourcesList(0) |
| 89 { |
| 90 } |
| 91 }; |
69 | 92 |
70 struct LRUList { | 93 struct LRUList { |
71 Resource* m_head; | 94 MemoryCacheEntry* m_head; |
72 Resource* m_tail; | 95 MemoryCacheEntry* m_tail; |
73 LRUList() : m_head(0), m_tail(0) { } | 96 LRUList() : m_head(0), m_tail(0) { } |
74 }; | 97 }; |
75 | 98 |
76 struct TypeStatistic { | 99 struct TypeStatistic { |
77 int count; | 100 int count; |
78 int size; | 101 int size; |
79 int liveSize; | 102 int liveSize; |
80 int decodedSize; | 103 int decodedSize; |
81 int encodedSize; | 104 int encodedSize; |
82 int encodedSizeDuplicatedInDataURLs; | 105 int encodedSizeDuplicatedInDataURLs; |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
131 // Calls to put the cached resource into and out of LRU lists. | 154 // Calls to put the cached resource into and out of LRU lists. |
132 void insertInLRUList(Resource*); | 155 void insertInLRUList(Resource*); |
133 void removeFromLRUList(Resource*); | 156 void removeFromLRUList(Resource*); |
134 | 157 |
135 // Called to adjust the cache totals when a resource changes size. | 158 // Called to adjust the cache totals when a resource changes size. |
136 void adjustSize(bool live, ptrdiff_t delta); | 159 void adjustSize(bool live, ptrdiff_t delta); |
137 | 160 |
138 // Track decoded resources that are in the cache and referenced by a Web pag
e. | 161 // Track decoded resources that are in the cache and referenced by a Web pag
e. |
139 void insertInLiveDecodedResourcesList(Resource*); | 162 void insertInLiveDecodedResourcesList(Resource*); |
140 void removeFromLiveDecodedResourcesList(Resource*); | 163 void removeFromLiveDecodedResourcesList(Resource*); |
| 164 bool isInLiveDecodedResourcesList(Resource*); |
141 | 165 |
142 void addToLiveResourcesSize(Resource*); | 166 void addToLiveResourcesSize(Resource*); |
143 void removeFromLiveResourcesSize(Resource*); | 167 void removeFromLiveResourcesSize(Resource*); |
144 | 168 |
145 static void removeURLFromCache(ExecutionContext*, const KURL&); | 169 static void removeURLFromCache(ExecutionContext*, const KURL&); |
146 | 170 |
147 Statistics getStatistics(); | 171 Statistics getStatistics(); |
148 | 172 |
149 size_t minDeadCapacity() const { return m_minDeadCapacity; } | 173 size_t minDeadCapacity() const { return m_minDeadCapacity; } |
150 size_t maxDeadCapacity() const { return m_maxDeadCapacity; } | 174 size_t maxDeadCapacity() const { return m_maxDeadCapacity; } |
151 size_t capacity() const { return m_capacity; } | 175 size_t capacity() const { return m_capacity; } |
152 size_t liveSize() const { return m_liveSize; } | 176 size_t liveSize() const { return m_liveSize; } |
153 size_t deadSize() const { return m_deadSize; } | 177 size_t deadSize() const { return m_deadSize; } |
154 | 178 |
155 // TaskObserver implementation | 179 // TaskObserver implementation |
156 virtual void willProcessTask() OVERRIDE; | 180 virtual void willProcessTask() OVERRIDE; |
157 virtual void didProcessTask() OVERRIDE; | 181 virtual void didProcessTask() OVERRIDE; |
158 | 182 |
159 private: | 183 private: |
160 LRUList* lruListFor(Resource*); | 184 LRUList* lruListFor(MemoryCacheEntry*); |
161 | 185 |
162 #ifdef MEMORY_CACHE_STATS | 186 #ifdef MEMORY_CACHE_STATS |
163 void dumpStats(Timer<MemoryCache>*); | 187 void dumpStats(Timer<MemoryCache>*); |
164 void dumpLRULists(bool includeLive) const; | 188 void dumpLRULists(bool includeLive) const; |
165 #endif | 189 #endif |
166 | 190 |
167 size_t liveCapacity() const; | 191 size_t liveCapacity() const; |
168 size_t deadCapacity() const; | 192 size_t deadCapacity() const; |
169 | 193 |
170 // pruneDeadResources() - Flush decoded and encoded data from resources not
referenced by Web pages. | 194 // pruneDeadResources() - Flush decoded and encoded data from resources not
referenced by Web pages. |
(...skipping 25 matching lines...) Expand all Loading... |
196 // more resources than the cached resource map, since it can also hold "stal
e" multiple versions of objects that are | 220 // more resources than the cached resource map, since it can also hold "stal
e" multiple versions of objects that are |
197 // waiting to die when the clients referencing them go away. | 221 // waiting to die when the clients referencing them go away. |
198 Vector<LRUList, 32> m_allResources; | 222 Vector<LRUList, 32> m_allResources; |
199 | 223 |
200 // Lists just for live resources with decoded data. Access to this list is b
ased off of painting the resource. | 224 // Lists just for live resources with decoded data. Access to this list is b
ased off of painting the resource. |
201 // The lists are ordered by decode priority, with higher indices having high
er priorities. | 225 // The lists are ordered by decode priority, with higher indices having high
er priorities. |
202 LRUList m_liveDecodedResources[Resource::CacheLiveResourcePriorityHigh + 1]; | 226 LRUList m_liveDecodedResources[Resource::CacheLiveResourcePriorityHigh + 1]; |
203 | 227 |
204 // A URL-based map of all resources that are in the cache (including the fre
shest version of objects that are currently being | 228 // A URL-based map of all resources that are in the cache (including the fre
shest version of objects that are currently being |
205 // referenced by a Web page). | 229 // referenced by a Web page). |
206 HashMap<String, Resource*> m_resources; | 230 typedef HashMap<String, OwnPtr<MemoryCacheEntry> > ResourceMap; |
| 231 ResourceMap m_resources; |
207 | 232 |
208 friend class MemoryCacheTest; | 233 friend class MemoryCacheTest; |
209 #ifdef MEMORY_CACHE_STATS | 234 #ifdef MEMORY_CACHE_STATS |
210 Timer<MemoryCache> m_statsTimer; | 235 Timer<MemoryCache> m_statsTimer; |
211 #endif | 236 #endif |
212 }; | 237 }; |
213 | 238 |
214 // Returns the global cache. | 239 // Returns the global cache. |
215 MemoryCache* memoryCache(); | 240 MemoryCache* memoryCache(); |
216 | 241 |
217 // Sets the global cache, used to swap in a test instance. | 242 // Sets the global cache, used to swap in a test instance. |
218 void setMemoryCacheForTesting(MemoryCache*); | 243 void setMemoryCacheForTesting(MemoryCache*); |
219 | 244 |
220 } | 245 } |
221 | 246 |
222 #endif | 247 #endif |
OLD | NEW |