void ResourceFetcher::garbageCollectDocumentResources() { typedef Vector<String, 10> StringVector; StringVector resourcesToDelete; for (DocumentResourceMap::iterator it = m_documentResources.begin(); it != m_documentResources.end(); ++it) { if (it->value->hasOneHandle()) resourcesToDelete.append(it->key); } m_documentResources.removeAll(resourcesToDelete); }
void CachedResourceLoader::garbageCollectDocumentResources() { typedef Vector<String, 10> StringVector; StringVector resourcesToDelete; for (DocumentResourceMap::iterator it = m_documentResources.begin(); it != m_documentResources.end(); ++it) { if (it->value->hasOneHandle()) { resourcesToDelete.append(it->key); it->value->setOwningCachedResourceLoader(0); } } for (StringVector::const_iterator it = resourcesToDelete.begin(); it != resourcesToDelete.end(); ++it) m_documentResources.remove(*it); }
// Garbage collecting m_documentResources is a workaround for the // CachedResourceHandles on the RHS being strong references. Ideally this // would be a weak map, however CachedResourceHandles perform additional // bookkeeping on CachedResources, so instead pseudo-GC them -- when the // reference count reaches 1, m_documentResources is the only reference, so // remove it from the map. void CachedResourceLoader::garbageCollectDocumentResourcesTimerFired(Timer<CachedResourceLoader>* timer) { ASSERT_UNUSED(timer, timer == &m_garbageCollectDocumentResourcesTimer); typedef Vector<String, 10> StringVector; StringVector resourcesToDelete; for (DocumentResourceMap::iterator it = m_documentResources.begin(); it != m_documentResources.end(); ++it) { if (it->second->hasOneHandle()) { resourcesToDelete.append(it->first); it->second->setOwningCachedResourceLoader(0); } } for (StringVector::const_iterator it = resourcesToDelete.begin(); it != resourcesToDelete.end(); ++it) m_documentResources.remove(*it); }