void ImageDecodingStore::unlockCache(const ImageFrameGenerator* generator, const ScaledImageFragment* cachedImage) { Vector<OwnPtr<CacheEntry> > cacheEntriesToDelete; { MutexLocker lock(m_mutex); cachedImage->bitmap().unlockPixels(); ImageCacheMap::iterator iter = m_imageCacheMap.find(ImageCacheEntry::makeCacheKey(generator, cachedImage->scaledSize(), cachedImage->index(), cachedImage->generation())); ASSERT_WITH_SECURITY_IMPLICATION(iter != m_imageCacheMap.end()); CacheEntry* cacheEntry = iter->value.get(); cacheEntry->decrementUseCount(); // Put the entry to the end of list. m_orderedCacheList.remove(cacheEntry); m_orderedCacheList.append(cacheEntry); // FIXME: This code is temporary such that in the new Skia // discardable memory path we do not cache images. // Once the transition is complete the logic to handle // image caching should be removed entirely. if (!s_imageCachingEnabled && !cacheEntry->useCount()) { removeFromCacheInternal(cacheEntry, &cacheEntriesToDelete); removeFromCacheListInternal(cacheEntriesToDelete); } } }
void ImageDecodingStore::unlockDecoder(const ImageFrameGenerator* generator, const ImageDecoder* decoder) { MutexLocker lock(m_mutex); DecoderCacheMap::iterator iter = m_decoderCacheMap.find(DecoderCacheEntry::makeCacheKey(generator, decoder)); ASSERT_WITH_SECURITY_IMPLICATION(iter != m_decoderCacheMap.end()); CacheEntry* cacheEntry = iter->value.get(); cacheEntry->decrementUseCount(); // Put the entry to the end of list. m_orderedCacheList.remove(cacheEntry); m_orderedCacheList.append(cacheEntry); }
void ImageDecodingStore::unlockCache(const ImageFrameGenerator* generator, const ScaledImageFragment* cachedImage) { MutexLocker lock(m_mutex); cachedImage->bitmap().unlockPixels(); CacheMap::iterator iter = m_cacheMap.find(std::make_pair(generator, cachedImage->scaledSize())); ASSERT(iter != m_cacheMap.end()); CacheEntry* cacheEntry = iter->value.get(); cacheEntry->decrementUseCount(); // Put the entry to the end of list. m_orderedCacheList.remove(cacheEntry); m_orderedCacheList.append(cacheEntry); }
void ImageDecodingStore::removeDecoder(const ImageFrameGenerator* generator, const ImageDecoder* decoder) { Vector<OwnPtr<CacheEntry> > cacheEntriesToDelete; { MutexLocker lock(m_mutex); DecoderCacheMap::iterator iter = m_decoderCacheMap.find(DecoderCacheEntry::makeCacheKey(generator, decoder)); ASSERT_WITH_SECURITY_IMPLICATION(iter != m_decoderCacheMap.end()); CacheEntry* cacheEntry = iter->value.get(); ASSERT(cacheEntry->useCount()); cacheEntry->decrementUseCount(); // Delete only one decoder cache entry. Ownership of the cache entry // is transfered to cacheEntriesToDelete such that object can be deleted // outside of the lock. removeFromCacheInternal(cacheEntry, &cacheEntriesToDelete); // Remove from LRU list. removeFromCacheListInternal(cacheEntriesToDelete); } }