public void RemoveCurrent()
 {
     m_currentLevelDecumulator.RemoveCurrent();
     if (m_currentLevel.Queue.Count == 0)
     {
         m_pendingLevelRemovals.Add(m_currentLevel.Priority);
         m_currentLevel = null;
     }
 }
 internal T Dequeue()
 {
     Global.Tracer.Assert(!m_pendingDecumulatorCommit, "Cannot perform operations on the queue until the open enumerator is Disposed");
     using (IDecumulator <T> decumulator = GetDecumulator())
     {
         decumulator.MoveNext();
         T current = decumulator.Current;
         decumulator.RemoveCurrent();
         return(current);
     }
 }
Exemplo n.º 3
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);
                        }
                    }
                }
            }
        }