void MemoryCache::insertInLRUList(CachedResource& resource) { ASSERT(resource.inCache()); ASSERT(resource.accessCount() > 0); auto addResult = lruListFor(resource).add(&resource); ASSERT_UNUSED(addResult, addResult.isNewEntry); }
void MemoryCache::resourceAccessed(CachedResource& resource) { ASSERT(resource.inCache()); // Need to make sure to remove before we increase the access count, since // the queue will possibly change. removeFromLRUList(resource); // If this is the first time the resource has been accessed, adjust the size of the cache to account for its initial size. if (!resource.accessCount()) adjustSize(resource.hasClients(), resource.size()); // Add to our access count. resource.increaseAccessCount(); // Now insert into the new queue. insertInLRUList(resource); }
void MemoryCache::removeFromLRUList(CachedResource& resource) { // If we've never been accessed, then we're brand new and not in any list. if (!resource.accessCount()) return; #if !ASSERT_DISABLED unsigned oldListIndex = resource.m_lruIndex; #endif LRUList& list = lruListFor(resource); // Verify that the list we got is the list we want. ASSERT(resource.m_lruIndex == oldListIndex); bool removed = list.remove(&resource); ASSERT_UNUSED(removed, removed); }
void MemoryCache::dumpLRULists(bool includeLive) const { printf("LRU-SP lists in eviction order (Kilobytes decoded, Kilobytes encoded, Access count, Referenced, isPurgeable, wasPurged):\n"); int size = m_allResources.size(); for (int i = size - 1; i >= 0; i--) { printf("\n\nList %d: ", i); CachedResource* current = m_allResources[i].m_tail; while (current) { CachedResource* prev = current->m_prevInAllResourcesList; if (includeLive || !current->hasClients()) printf("(%.1fK, %.1fK, %uA, %dR, %d, %d); ", current->decodedSize() / 1024.0f, (current->encodedSize() + current->overheadSize()) / 1024.0f, current->accessCount(), current->hasClients(), current->isPurgeable(), current->wasPurged()); current = prev; } } }