protected override void FulfillInProgressFree()
 {
     m_storage.FreezeAllocations = true;
     while (m_inProgressFreeBytes > 0 && m_cachePriority.Count > 0)
     {
         StorageItem storageItem = m_cachePriority.ExtractLRU();
         storageItem.InQueue = InQueueState.None;
         if (storageItem.Item != null && storageItem.PinCount == 0)
         {
             CacheRemoveValue(storageItem.Id);
             int num = ItemSizes.SizeOf(storageItem);
             storageItem.Flush(m_storage, m_offsetMap);
             m_cacheSizeBytes -= num;
             if (m_cacheSizeBytes < 0)
             {
                 m_cacheSizeBytes = 0L;
             }
             m_inProgressFreeBytes -= num;
             if (m_inProgressFreeBytes < 0)
             {
                 m_inProgressFreeBytes = 0L;
             }
         }
     }
     m_storage.FreezeAllocations = false;
 }
Exemplo n.º 2
0
        protected sealed override void FulfillInProgressFree()
        {
            int num = m_cachePriority.Count;

            while (m_inProgressFreeBytes > 0 && num > 0)
            {
                num--;
                ItemHolder    itemHolder = m_cachePriority.Peek();
                BaseReference reference  = itemHolder.Reference;
                if (reference.PinCount == 0)
                {
                    m_cachePriority.ExtractLRU();
                    reference.InQueue = InQueueState.None;
                    if (itemHolder.Item != null)
                    {
                        UpdateStatsForRemovedItem(reference, ref m_inProgressFreeBytes);
                        CacheRemoveValue(reference.Id);
                        itemHolder.Item      = null;
                        itemHolder.Reference = null;
                        reference.Item       = null;
                    }
                }
                else
                {
                    m_cachePriority.Bump(itemHolder);
                }
            }
            if (m_inProgressFreeBytes <= 0)
            {
                return;
            }
            using (IDecumulator <BaseReference> decumulator = m_serializationQueue.GetDecumulator())
            {
                while (m_inProgressFreeBytes > 0 && decumulator.MoveNext())
                {
                    BaseReference current = decumulator.Current;
                    decumulator.RemoveCurrent();
                    if (current.Item != null)
                    {
                        if (current.PinCount == 0)
                        {
                            UpdateStatsForRemovedItem(current, ref m_inProgressFreeBytes);
                        }
                        WriteItem(current);
                        if (current.PinCount > 0)
                        {
                            EnqueueItem(current);
                            CacheSetValue(current.Id, current);
                        }
                    }
                }
            }
        }