Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(323)

Side by Side Diff: third_party/WebKit/Source/platform/graphics/ImageDecodingStore.cpp

Issue 2807923002: Replace ASSERT, ASSERT_NOT_REACHED, and RELEASE_ASSERT in platform/graphics (Closed)
Patch Set: Replace ASSERT, ASSERT_NOT_REACHED, and RELEASE_ASSERT in platform/graphics Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2012 Google Inc. All rights reserved. 2 * Copyright (C) 2012 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
(...skipping 27 matching lines...) Expand all
38 38
39 } // namespace 39 } // namespace
40 40
41 ImageDecodingStore::ImageDecodingStore() 41 ImageDecodingStore::ImageDecodingStore()
42 : m_heapLimitInBytes(defaultMaxTotalSizeOfHeapEntries), 42 : m_heapLimitInBytes(defaultMaxTotalSizeOfHeapEntries),
43 m_heapMemoryUsageInBytes(0) {} 43 m_heapMemoryUsageInBytes(0) {}
44 44
45 ImageDecodingStore::~ImageDecodingStore() { 45 ImageDecodingStore::~ImageDecodingStore() {
46 #if DCHECK_IS_ON() 46 #if DCHECK_IS_ON()
47 setCacheLimitInBytes(0); 47 setCacheLimitInBytes(0);
48 ASSERT(!m_decoderCacheMap.size()); 48 DCHECK(!m_decoderCacheMap.size());
49 ASSERT(!m_orderedCacheList.size()); 49 DCHECK(!m_orderedCacheList.size());
50 ASSERT(!m_decoderCacheKeyMap.size()); 50 DCHECK(!m_decoderCacheKeyMap.size());
51 #endif 51 #endif
52 } 52 }
53 53
54 ImageDecodingStore& ImageDecodingStore::instance() { 54 ImageDecodingStore& ImageDecodingStore::instance() {
55 DEFINE_THREAD_SAFE_STATIC_LOCAL(ImageDecodingStore, store, 55 DEFINE_THREAD_SAFE_STATIC_LOCAL(ImageDecodingStore, store,
56 ImageDecodingStore::create().release()); 56 ImageDecodingStore::create().release());
57 return store; 57 return store;
58 } 58 }
59 59
60 bool ImageDecodingStore::lockDecoder(const ImageFrameGenerator* generator, 60 bool ImageDecodingStore::lockDecoder(const ImageFrameGenerator* generator,
61 const SkISize& scaledSize, 61 const SkISize& scaledSize,
62 ImageDecoder** decoder) { 62 ImageDecoder** decoder) {
63 ASSERT(decoder); 63 DCHECK(decoder);
64 64
65 MutexLocker lock(m_mutex); 65 MutexLocker lock(m_mutex);
66 DecoderCacheMap::iterator iter = m_decoderCacheMap.find( 66 DecoderCacheMap::iterator iter = m_decoderCacheMap.find(
67 DecoderCacheEntry::makeCacheKey(generator, scaledSize)); 67 DecoderCacheEntry::makeCacheKey(generator, scaledSize));
68 if (iter == m_decoderCacheMap.end()) 68 if (iter == m_decoderCacheMap.end())
69 return false; 69 return false;
70 70
71 DecoderCacheEntry* cacheEntry = iter->value.get(); 71 DecoderCacheEntry* cacheEntry = iter->value.get();
72 72
73 // There can only be one user of a decoder at a time. 73 // There can only be one user of a decoder at a time.
74 ASSERT(!cacheEntry->useCount()); 74 DCHECK(!cacheEntry->useCount());
75 cacheEntry->incrementUseCount(); 75 cacheEntry->incrementUseCount();
76 *decoder = cacheEntry->cachedDecoder(); 76 *decoder = cacheEntry->cachedDecoder();
77 return true; 77 return true;
78 } 78 }
79 79
80 void ImageDecodingStore::unlockDecoder(const ImageFrameGenerator* generator, 80 void ImageDecodingStore::unlockDecoder(const ImageFrameGenerator* generator,
81 const ImageDecoder* decoder) { 81 const ImageDecoder* decoder) {
82 MutexLocker lock(m_mutex); 82 MutexLocker lock(m_mutex);
83 DecoderCacheMap::iterator iter = m_decoderCacheMap.find( 83 DecoderCacheMap::iterator iter = m_decoderCacheMap.find(
84 DecoderCacheEntry::makeCacheKey(generator, decoder)); 84 DecoderCacheEntry::makeCacheKey(generator, decoder));
85 SECURITY_DCHECK(iter != m_decoderCacheMap.end()); 85 SECURITY_DCHECK(iter != m_decoderCacheMap.end());
86 86
87 CacheEntry* cacheEntry = iter->value.get(); 87 CacheEntry* cacheEntry = iter->value.get();
88 cacheEntry->decrementUseCount(); 88 cacheEntry->decrementUseCount();
89 89
90 // Put the entry to the end of list. 90 // Put the entry to the end of list.
91 m_orderedCacheList.remove(cacheEntry); 91 m_orderedCacheList.remove(cacheEntry);
92 m_orderedCacheList.append(cacheEntry); 92 m_orderedCacheList.append(cacheEntry);
93 } 93 }
94 94
95 void ImageDecodingStore::insertDecoder(const ImageFrameGenerator* generator, 95 void ImageDecodingStore::insertDecoder(const ImageFrameGenerator* generator,
96 std::unique_ptr<ImageDecoder> decoder) { 96 std::unique_ptr<ImageDecoder> decoder) {
97 // Prune old cache entries to give space for the new one. 97 // Prune old cache entries to give space for the new one.
98 prune(); 98 prune();
99 99
100 std::unique_ptr<DecoderCacheEntry> newCacheEntry = 100 std::unique_ptr<DecoderCacheEntry> newCacheEntry =
101 DecoderCacheEntry::create(generator, std::move(decoder)); 101 DecoderCacheEntry::create(generator, std::move(decoder));
102 102
103 MutexLocker lock(m_mutex); 103 MutexLocker lock(m_mutex);
104 ASSERT(!m_decoderCacheMap.contains(newCacheEntry->cacheKey())); 104 DCHECK(!m_decoderCacheMap.contains(newCacheEntry->cacheKey()));
105 insertCacheInternal(std::move(newCacheEntry), &m_decoderCacheMap, 105 insertCacheInternal(std::move(newCacheEntry), &m_decoderCacheMap,
106 &m_decoderCacheKeyMap); 106 &m_decoderCacheKeyMap);
107 } 107 }
108 108
109 void ImageDecodingStore::removeDecoder(const ImageFrameGenerator* generator, 109 void ImageDecodingStore::removeDecoder(const ImageFrameGenerator* generator,
110 const ImageDecoder* decoder) { 110 const ImageDecoder* decoder) {
111 Vector<std::unique_ptr<CacheEntry>> cacheEntriesToDelete; 111 Vector<std::unique_ptr<CacheEntry>> cacheEntriesToDelete;
112 { 112 {
113 MutexLocker lock(m_mutex); 113 MutexLocker lock(m_mutex);
114 DecoderCacheMap::iterator iter = m_decoderCacheMap.find( 114 DecoderCacheMap::iterator iter = m_decoderCacheMap.find(
115 DecoderCacheEntry::makeCacheKey(generator, decoder)); 115 DecoderCacheEntry::makeCacheKey(generator, decoder));
116 SECURITY_DCHECK(iter != m_decoderCacheMap.end()); 116 SECURITY_DCHECK(iter != m_decoderCacheMap.end());
117 117
118 CacheEntry* cacheEntry = iter->value.get(); 118 CacheEntry* cacheEntry = iter->value.get();
119 ASSERT(cacheEntry->useCount()); 119 DCHECK(cacheEntry->useCount());
120 cacheEntry->decrementUseCount(); 120 cacheEntry->decrementUseCount();
121 121
122 // Delete only one decoder cache entry. Ownership of the cache entry 122 // Delete only one decoder cache entry. Ownership of the cache entry
123 // is transfered to cacheEntriesToDelete such that object can be deleted 123 // is transfered to cacheEntriesToDelete such that object can be deleted
124 // outside of the lock. 124 // outside of the lock.
125 removeFromCacheInternal(cacheEntry, &cacheEntriesToDelete); 125 removeFromCacheInternal(cacheEntry, &cacheEntriesToDelete);
126 126
127 // Remove from LRU list. 127 // Remove from LRU list.
128 removeFromCacheListInternal(cacheEntriesToDelete); 128 removeFromCacheListInternal(cacheEntriesToDelete);
129 } 129 }
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
234 "ImageDecodingStoreNumOfDecoders", m_decoderCacheMap.size()); 234 "ImageDecodingStoreNumOfDecoders", m_decoderCacheMap.size());
235 } 235 }
236 236
237 template <class T, class U, class V> 237 template <class T, class U, class V>
238 void ImageDecodingStore::removeFromCacheInternal( 238 void ImageDecodingStore::removeFromCacheInternal(
239 const T* cacheEntry, 239 const T* cacheEntry,
240 U* cacheMap, 240 U* cacheMap,
241 V* identifierMap, 241 V* identifierMap,
242 Vector<std::unique_ptr<CacheEntry>>* deletionList) { 242 Vector<std::unique_ptr<CacheEntry>>* deletionList) {
243 const size_t cacheEntryBytes = cacheEntry->memoryUsageInBytes(); 243 const size_t cacheEntryBytes = cacheEntry->memoryUsageInBytes();
244 ASSERT(m_heapMemoryUsageInBytes >= cacheEntryBytes); 244 DCHECK_GE(m_heapMemoryUsageInBytes, cacheEntryBytes);
245 m_heapMemoryUsageInBytes -= cacheEntryBytes; 245 m_heapMemoryUsageInBytes -= cacheEntryBytes;
246 246
247 // Remove entry from identifier map. 247 // Remove entry from identifier map.
248 typename V::iterator iter = identifierMap->find(cacheEntry->generator()); 248 typename V::iterator iter = identifierMap->find(cacheEntry->generator());
249 ASSERT(iter != identifierMap->end()); 249 DCHECK_NE(iter, identifierMap->end());
250 iter->value.erase(cacheEntry->cacheKey()); 250 iter->value.erase(cacheEntry->cacheKey());
251 if (!iter->value.size()) 251 if (!iter->value.size())
252 identifierMap->erase(iter); 252 identifierMap->erase(iter);
253 253
254 // Remove entry from cache map. 254 // Remove entry from cache map.
255 deletionList->push_back(cacheMap->take(cacheEntry->cacheKey())); 255 deletionList->push_back(cacheMap->take(cacheEntry->cacheKey()));
256 256
257 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("blink.image_decoding"), 257 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("blink.image_decoding"),
258 "ImageDecodingStoreHeapMemoryUsageBytes", 258 "ImageDecodingStoreHeapMemoryUsageBytes",
259 m_heapMemoryUsageInBytes); 259 m_heapMemoryUsageInBytes);
260 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("blink.image_decoding"), 260 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("blink.image_decoding"),
261 "ImageDecodingStoreNumOfDecoders", m_decoderCacheMap.size()); 261 "ImageDecodingStoreNumOfDecoders", m_decoderCacheMap.size());
262 } 262 }
263 263
264 void ImageDecodingStore::removeFromCacheInternal( 264 void ImageDecodingStore::removeFromCacheInternal(
265 const CacheEntry* cacheEntry, 265 const CacheEntry* cacheEntry,
266 Vector<std::unique_ptr<CacheEntry>>* deletionList) { 266 Vector<std::unique_ptr<CacheEntry>>* deletionList) {
267 if (cacheEntry->type() == CacheEntry::TypeDecoder) { 267 if (cacheEntry->type() == CacheEntry::TypeDecoder) {
268 removeFromCacheInternal(static_cast<const DecoderCacheEntry*>(cacheEntry), 268 removeFromCacheInternal(static_cast<const DecoderCacheEntry*>(cacheEntry),
269 &m_decoderCacheMap, &m_decoderCacheKeyMap, 269 &m_decoderCacheMap, &m_decoderCacheKeyMap,
270 deletionList); 270 deletionList);
271 } else { 271 } else {
272 ASSERT(false); 272 DCHECK(false);
273 } 273 }
274 } 274 }
275 275
276 template <class U, class V> 276 template <class U, class V>
277 void ImageDecodingStore::removeCacheIndexedByGeneratorInternal( 277 void ImageDecodingStore::removeCacheIndexedByGeneratorInternal(
278 U* cacheMap, 278 U* cacheMap,
279 V* identifierMap, 279 V* identifierMap,
280 const ImageFrameGenerator* generator, 280 const ImageFrameGenerator* generator,
281 Vector<std::unique_ptr<CacheEntry>>* deletionList) { 281 Vector<std::unique_ptr<CacheEntry>>* deletionList) {
282 typename V::iterator iter = identifierMap->find(generator); 282 typename V::iterator iter = identifierMap->find(generator);
283 if (iter == identifierMap->end()) 283 if (iter == identifierMap->end())
284 return; 284 return;
285 285
286 // Get all cache identifiers associated with generator. 286 // Get all cache identifiers associated with generator.
287 Vector<typename U::KeyType> cacheIdentifierList; 287 Vector<typename U::KeyType> cacheIdentifierList;
288 copyToVector(iter->value, cacheIdentifierList); 288 copyToVector(iter->value, cacheIdentifierList);
289 289
290 // For each cache identifier find the corresponding CacheEntry and remove it. 290 // For each cache identifier find the corresponding CacheEntry and remove it.
291 for (size_t i = 0; i < cacheIdentifierList.size(); ++i) { 291 for (size_t i = 0; i < cacheIdentifierList.size(); ++i) {
292 ASSERT(cacheMap->contains(cacheIdentifierList[i])); 292 DCHECK(cacheMap->contains(cacheIdentifierList[i]));
293 const auto& cacheEntry = cacheMap->at(cacheIdentifierList[i]); 293 const auto& cacheEntry = cacheMap->at(cacheIdentifierList[i]);
294 ASSERT(!cacheEntry->useCount()); 294 DCHECK(!cacheEntry->useCount());
295 removeFromCacheInternal(cacheEntry, cacheMap, identifierMap, deletionList); 295 removeFromCacheInternal(cacheEntry, cacheMap, identifierMap, deletionList);
296 } 296 }
297 } 297 }
298 298
299 void ImageDecodingStore::removeFromCacheListInternal( 299 void ImageDecodingStore::removeFromCacheListInternal(
300 const Vector<std::unique_ptr<CacheEntry>>& deletionList) { 300 const Vector<std::unique_ptr<CacheEntry>>& deletionList) {
301 for (size_t i = 0; i < deletionList.size(); ++i) 301 for (size_t i = 0; i < deletionList.size(); ++i)
302 m_orderedCacheList.remove(deletionList[i].get()); 302 m_orderedCacheList.remove(deletionList[i].get());
303 } 303 }
304 304
305 } // namespace blink 305 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698