Beispiel #1
0
 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);
 }
Beispiel #2
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();
     }
 }
Beispiel #3
0
            public override bool Equals(object o)
            {
                CachedPageKey right = (CachedPageKey)o;

                return(Object.ReferenceEquals(right._owner, _owner) && right._offset == _offset);
            }