private CachedPage AddPageToCache(long pageIndex) { lock (locker) { //Make sure cache page limit is not exceeded long maxCacheCount = CachedPageCapacity - 1;//-1 so we can insert the new page long countToEvict = cachedPages.Count - maxCacheCount; if (countToEvict > 0) { List <long> indicesToEvict = cachedPages.OrderBy(x => x.Value.RecentUseCounter).Select(y => y.Key).Take((int)countToEvict).ToList(); foreach (var indexToEvict in indicesToEvict) { EvictPageFromCache(indexToEvict); } } CachedPage page = new CachedPage(this, pageIndex); cachedPages.Add(pageIndex, page); return(page); } }
private bool TryGetCachedPage(long pageIndex, out CachedPage cachedPage) { lock (locker) { if (CachedPageCapacity == 0) { cachedPage = null; return(false); } if (!cachedPages.TryGetValue(pageIndex, out cachedPage)) { //The page is not yet in cache if (PageStorage.IsPageAllocated(pageIndex)) { try { cachedPage = AddPageToCache(pageIndex); return(true); } catch (OutOfMemoryException) { cachedPage = null; return(false); } } else { //The page is not allocated, cannot cache it cachedPage = null; return(false); } } else { return(true); } } }