Issue #2928 - Avoid searching the image cache queue for an entry after we just popped it off the queue.

This commit is contained in:
Moonchild 2026-02-04 09:07:23 +01:00 committed by wuggy
commit 3b799da2f8
2 changed files with 30 additions and 6 deletions

View file

@ -1013,6 +1013,12 @@ imgCacheQueue::GetNumElements() const
return mQueue.size();
}
bool
imgCacheQueue::Contains(imgCacheEntry* aEntry) const
{
return mQueue.Contains(aEntry);
}
imgCacheQueue::iterator
imgCacheQueue::begin()
{
@ -1631,7 +1637,9 @@ imgLoader::CheckCacheLimits(imgCacheTable& cache, imgCacheQueue& queue)
}
if (entry) {
RemoveFromCache(entry);
// We just popped this entry from the queue, so pass AlreadyRemoved
// to avoid searching the queue again in RemoveFromCache.
RemoveFromCache(entry, QueueState::AlreadyRemoved);
}
}
}
@ -1930,7 +1938,7 @@ imgLoader::RemoveFromCache(const ImageCacheKey& aKey)
}
bool
imgLoader::RemoveFromCache(imgCacheEntry* entry)
imgLoader::RemoveFromCache(imgCacheEntry* entry, QueueState aQueueState)
{
LOG_STATIC_FUNC(gImgLog, "imgLoader::RemoveFromCache entry");
@ -1944,6 +1952,8 @@ imgLoader::RemoveFromCache(imgCacheEntry* entry)
"imgLoader::RemoveFromCache", "entry's uri",
key.Spec());
cache.Remove(key);
if (queue.IsDirty()) {
queue.Refresh();
}
@ -1954,11 +1964,16 @@ imgLoader::RemoveFromCache(imgCacheEntry* entry)
if (mCacheTracker) {
mCacheTracker->RemoveObject(entry);
}
queue.Remove(entry);
// Only search the queue to remove the entry if its possible it might
// be in the queue. If we know its not in the queue this would be
// wasted work.
MOZ_ASSERT_IF(aQueueState == QueueState::AlreadyRemoved,
!queue.Contains(entry));
if (aQueueState == QueueState::MaybeExists) {
queue.Remove(entry);
}
}
cache.Remove(key);
entry->SetEvicted(true);
request->SetIsInCache(false);
AddToUncachedImages(request);