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;
 }
        internal override void Free(BaseReference reference)
        {
            if (reference == null)
            {
                return;
            }
            ReferenceID id = reference.Id;

            if (CacheTryGetValue(id, out StorageItem item))
            {
                CacheRemoveValue(id);
            }
            if (item == null)
            {
                item = (StorageItem)reference.Item;
            }
            if (item != null)
            {
                if (item.InQueue == InQueueState.InQueue)
                {
                    m_cachePriority.Remove(item);
                }
                int num = ItemSizes.SizeOf(item);
                m_cacheSizeBytes    -= num;
                m_totalAuditedBytes -= num;
                m_totalFreedBytes   += num;
                UpdatePeakCacheSize();
                item.Item = null;
                item.UnlinkReferences(updateId: false);
            }
            reference.Item = null;
        }
Ejemplo n.º 3
0
        public int UpdateSize()
        {
            int size = m_size;

            m_size = CalculateSize(ItemSizes.SizeOf(Item));
            return(m_size - size);
        }
Ejemplo n.º 4
0
        internal void SetTreePartitionContentsAndPin <T>(IReference <T> emptyPartitionRef, T contents) where T : IStorable
        {
            BaseReference baseReference = (BaseReference)emptyPartitionRef;

            m_partitionManager.TreeHasChanged = true;
            CacheItem(baseReference, contents, fromDeserialize: false, ItemSizes.SizeOf(contents));
            baseReference.PinValue();
            CacheSetValue(baseReference.Id, baseReference);
        }
Ejemplo n.º 5
0
        private void UpdateStatsForRemovedItem(BaseReference itemRef, ref long bytesToFree)
        {
            long num  = ItemSizes.SizeOf(itemRef.Item.Item);
            long num2 = m_cacheSizeBytes - num;
            long num3 = m_cacheFreeableBytes - num;

            if (num3 < 0)
            {
                num3 = 0L;
            }
            if (num2 < num3)
            {
                num2 = num3;
            }
            m_cacheFreeableBytes = num3;
            m_cacheSizeBytes     = num2;
            bytesToFree         -= num;
        }
        private void CacheItem(BaseReference reference, StorageItem item, bool fromDeserialize)
        {
            reference.Item = item;
            item.AddReference(reference);
            int num = ItemSizes.SizeOf(item);

            FreeCacheSpace(num, m_cacheSizeBytes);
            if (fromDeserialize)
            {
                CacheSetValue(reference.Id, item);
            }
            else
            {
                m_totalAuditedBytes += num;
            }
            m_cacheSizeBytes += num;
            EnqueueItem(item);
            (item.Item as ISelfReferential)?.SetReference(reference);
        }
Ejemplo n.º 7
0
        private IStorable LoadItem(BaseReference reference)
        {
            if (m_inStreamOper)
            {
                Global.Tracer.Assert(condition: false, "PartitionedTreeScalabilityCache should not Load during serialization");
            }
            IStorable storable = null;

            try
            {
                m_inStreamOper = true;
                m_deserializationTimer.Start();
                ReferenceID id = reference.Id;
                long        num;
                if (!id.IsTemporary && id.HasMultiPart)
                {
                    num = m_partitionManager.GetTreePartitionOffset(id);
                    if (num < 0)
                    {
                        return(null);
                    }
                }
                else
                {
                    num = reference.Id.Value;
                }
                if (num < 0)
                {
                    Global.Tracer.Assert(false, "Invalid offset for item.  ReferenceID: {0}, Offset: {1}", id, num);
                }
                storable = (IStorable)m_storage.Retrieve(num, out long _);
            }
            finally
            {
                m_inStreamOper = false;
                m_deserializationTimer.Stop();
            }
            CacheItem(reference, storable, fromDeserialize: true, ItemSizes.SizeOf(storable));
            return(storable);
        }
Ejemplo n.º 8
0
 internal sealed override void UnPin(BaseReference reference)
 {
     if (reference.PinCount == 0 && (reference.Id.IsTemporary || reference.Id.HasMultiPart) && reference.InQueue == InQueueState.None)
     {
         reference.InQueue = InQueueState.InQueue;
         m_serializationQueue.Enqueue(reference);
         if (!m_lockedDownForFlush)
         {
             ItemHolder item = reference.Item;
             IStorable  obj  = null;
             if (item != null)
             {
                 obj = item.Item;
             }
             m_cacheFreeableBytes += ItemSizes.SizeOf(obj);
         }
     }
     if (!m_lockedDownForFlush)
     {
         PeriodicOperationCheck();
     }
 }
Ejemplo n.º 9
0
        internal sealed override IStorable Retrieve(BaseReference reference)
        {
            if (reference.Item == null)
            {
                ReferenceID id = reference.Id;
                if (CacheTryGetValue(id, out BaseReference item) && item.Item != null)
                {
                    IStorable item2 = item.Item.Item;
                    CacheItem(reference, item2, fromDeserialize: true, ItemSizes.SizeOf(item2));
                }
                else
                {
                    LoadItem(reference);
                }
            }
            IStorable result = null;

            if (reference.Item != null)
            {
                result = reference.Item.Item;
            }
            return(result);
        }
Ejemplo n.º 10
0
 public sealed override IReference <T> AllocateAndPin <T>(T obj, int priority)
 {
     return((IReference <T>)AllocateAndPin(obj, ItemSizes.SizeOf(obj)));
 }
        public override IReference <T> GenerateFixedReference <T>(T obj)
        {
            BaseReference baseReference = CreateReference(obj);

            baseReference.Init(this, m_offsetMap.GenerateTempId());
            StorageItem storageItem = (StorageItem)(baseReference.Item = new StorageItem(baseReference.Id, -1, obj, ItemSizes.SizeOf(obj)));

            storageItem.AddReference(baseReference);
            storageItem.InQueue         = InQueueState.Exempt;
            storageItem.HasBeenUnPinned = true;
            (obj as ISelfReferential)?.SetReference(baseReference);
            return((IReference <T>)baseReference);
        }
 public override IReference <T> AllocateAndPin <T>(T obj, int priority)
 {
     return(InternalAllocate(obj, priority, startPinned: true, ItemSizes.SizeOf(obj)));
 }