public SharedCachingStrategy(int cacheSize) { cacheSize &= (int)(CachedPage._outPageBits & 0x7fffffff); _dirtyPages = new HashSet(); _pagesCache = new ObjectCache(cacheSize >> CachedPage._pageShiftBits); _pagesCache.ObjectRemoved += new ObjectCacheEventHandler(_pagesCache_ObjectRemoved); _searchKey = new CachedPageKey(null, 0); }
public void Flush(CachedStream owner) { if (_dirtyPages.Count > 0) { if (_dirtyPages.Count == 1) { foreach (HashSet.Entry e in _dirtyPages) { CachedPageKey key = (CachedPageKey)e.Key; if (Object.ReferenceEquals(key._owner, owner)) { ((CachedPage)_pagesCache.TryKey(key)).Save(); } } } else { IntArrayList pageOffsets = IntArrayListPool.Alloc(); try { foreach (HashSet.Entry e in _dirtyPages) { CachedPageKey key = (CachedPageKey)e.Key; if (Object.ReferenceEquals(key._owner, owner)) { pageOffsets.Add(key._offset); } } pageOffsets.Sort(); _searchKey._owner = owner; for (int i = 0; i < pageOffsets.Count; ++i) { _searchKey._offset = pageOffsets[i]; ((CachedPage)_pagesCache.TryKey(_searchKey)).Save(); } } finally { IntArrayListPool.Dispose(pageOffsets); } } } if (owner.GetUnderlyingStream().CanWrite) { owner.GetUnderlyingStream().Flush(); } }
public override bool Equals(object o) { CachedPageKey right = (CachedPageKey)o; return(Object.ReferenceEquals(right._owner, _owner) && right._offset == _offset); }