bundleCacheEntry_t * nsStringBundleService::insertIntoCache(nsIStringBundle* aBundle, nsCStringKey* aHashKey) { bundleCacheEntry_t *cacheEntry; if (mBundleMap.Count() < MAX_CACHED_BUNDLES) { // cache not full - create a new entry void *cacheEntryArena; PL_ARENA_ALLOCATE(cacheEntryArena, &mCacheEntryPool, sizeof(bundleCacheEntry_t)); cacheEntry = (bundleCacheEntry_t*)cacheEntryArena; } else { // cache is full // take the last entry in the list, and recycle it. cacheEntry = (bundleCacheEntry_t*)PR_LIST_TAIL(&mBundleCache); // remove it from the hash table and linked list NS_ASSERTION(mBundleMap.Exists(cacheEntry->mHashKey), "Element will not be removed!"); #ifdef DEBUG_alecf NS_WARNING(nsPrintfCString(300, "Booting %s to make room for %s\n", cacheEntry->mHashKey->GetString(), aHashKey->GetString()).get()); #endif mBundleMap.Remove(cacheEntry->mHashKey); PR_REMOVE_LINK((PRCList*)cacheEntry); // free up excess memory recycleEntry(cacheEntry); } // at this point we have a new cacheEntry that doesn't exist // in the hashtable, so set up the cacheEntry cacheEntry->mBundle = aBundle; NS_ADDREF(cacheEntry->mBundle); cacheEntry->mHashKey = (nsCStringKey*)aHashKey->Clone(); // insert the entry into the cache and map, make it the MRU mBundleMap.Put(cacheEntry->mHashKey, cacheEntry); return cacheEntry; }
void nsStringBundleService::flushBundleCache() { // release all bundles in the cache mBundleMap.Reset(); PRCList *current = PR_LIST_HEAD(&mBundleCache); while (current != &mBundleCache) { bundleCacheEntry_t *cacheEntry = (bundleCacheEntry_t*)current; recycleEntry(cacheEntry); PRCList *oldItem = current; current = PR_NEXT_LINK(current); // will be freed in PL_FreeArenaPool PR_REMOVE_LINK(oldItem); } PL_FreeArenaPool(&mCacheEntryPool); }
//******************************************************************************** void TBlockPageIndexMap::removeBlockPages(int a_dbId, int a_blkId) { std::stack<ASSOC_ENTRY*> stkAssoc; int hashIdx = getBlockHashIndex(a_dbId, a_blkId); ASSOC_ENTRY *pEntry = m_hashBlk[hashIdx]; while(pEntry) { if(pEntry->dbId == a_dbId && pEntry->blkId == a_blkId) { stkAssoc.push(pEntry); } pEntry = pEntry->pLowerIndex; } while(!stkAssoc.empty()) { pEntry = stkAssoc.top(); stkAssoc.pop(); unlinkAssoc(pEntry); // not unlinkEntry recycleEntry(pEntry); } }