void MemoryCache::prune(Resource* justReleasedResource) { TRACE_EVENT0("renderer", "MemoryCache::prune()"); if (m_inPruneResources) return; if (m_liveSize + m_deadSize <= m_capacity && m_maxDeadCapacity && m_deadSize <= m_maxDeadCapacity) // Fast path. return; // To avoid burdening the current thread with repetitive pruning jobs, // pruning is postponed until the end of the current task. If it has // been more than m_maxPruneDeferralDelay since the last prune, // then we prune immediately. // If the current thread's run loop is not active, then pruning will happen // immediately only if it has been over m_maxPruneDeferralDelay // since the last prune. double currentTime = WTF::currentTime(); if (m_prunePending) { if (currentTime - m_pruneTimeStamp >= m_maxPruneDeferralDelay) { pruneNow(currentTime, AutomaticPrune); } } else { if (currentTime - m_pruneTimeStamp >= m_maxPruneDeferralDelay) { pruneNow(currentTime, AutomaticPrune); // Delay exceeded, prune now. } else { // Defer. Platform::current()->currentThread()->addTaskObserver(this); m_prunePending = true; } } if (m_prunePending && m_deadSize > m_maxDeferredPruneDeadCapacity && justReleasedResource) { // The following eviction does not respect LRU order, but it can be done // immediately in constant time, as opposed to pruneDeadResources, which // we would rather defer because it is O(N), which would make tear-down of N // objects O(N^2) if we pruned immediately. This immediate eviction is a // safeguard against runaway memory consumption by dead resources // while a prune is pending. // Main Resources in the cache are only substitue data that was // precached and should not be evicted. if (justReleasedResource->type() != Resource::MainResource) { if (MemoryCacheEntry* entry = getEntryForResource(justReleasedResource)) evict(entry); } // As a last resort, prune immediately if (m_deadSize > m_maxDeferredPruneDeadCapacity) pruneNow(currentTime, AutomaticPrune); } }
void MemoryCache::didProcessTask() { // Perform deferred pruning ASSERT(m_prunePending); pruneNow(WTF::currentTime()); }
void MemoryCache::pruneAll() { double currentTime = WTF::currentTime(); pruneNow(currentTime, MaximalPrune); }