nsresult nsMemoryCacheDevice::DoEvictEntries(bool (*matchFn)(nsCacheEntry* entry, void* args), void* args) { nsCacheEntry * entry; for (int i = kQueueCount - 1; i >= 0; --i) { PRCList * elem = PR_LIST_HEAD(&mEvictionList[i]); while (elem != &mEvictionList[i]) { entry = (nsCacheEntry *)elem; elem = PR_NEXT_LINK(elem); if (!matchFn(entry, args)) continue; if (entry->IsInUse()) { nsresult rv = nsCacheService::DoomEntry(entry); if (NS_FAILED(rv)) { CACHE_LOG_WARNING(("memCache->DoEvictEntries() aborted: rv =%x", rv)); return rv; } } else { EvictEntry(entry, DELETE_ENTRY); } } } return NS_OK; }
nsresult nsMemoryCacheDevice::EvictEntries(const char * clientID) { nsCacheEntry * entry; uint32_t prefixLength = (clientID ? strlen(clientID) : 0); for (int i = kQueueCount - 1; i >= 0; --i) { PRCList * elem = PR_LIST_HEAD(&mEvictionList[i]); while (elem != &mEvictionList[i]) { entry = (nsCacheEntry *)elem; elem = PR_NEXT_LINK(elem); const char * key = entry->Key()->get(); if (clientID && nsCRT::strncmp(clientID, key, prefixLength) != 0) continue; if (entry->IsInUse()) { nsresult rv = nsCacheService::DoomEntry(entry); if (NS_FAILED(rv)) { CACHE_LOG_WARNING(("memCache->EvictEntries() aborted: rv =%x", rv)); return rv; } } else { EvictEntry(entry, DELETE_ENTRY); } } } return NS_OK; }