예제 #1
0
        private int AllocateBlockId()
        {
            var freeBlock = FreeBlocks.Where(b => !InitialFreeBlocks.Contains(b)).FirstOrDefault();

            if (freeBlock == 0)
            {
                freeBlock = FreeBlocks.FirstOrDefault();
            }
            if (freeBlock == 0)
            {
                freeBlock = TailBlockId++;
            }
            FreeBlocks.Remove(freeBlock);
            AllocatedBlocks.Add(freeBlock);
            return(freeBlock);
        }
예제 #2
0
        public void FreeBlock(int blockId)
        {
            VerifyValidDataBlock(blockId);
            IsChanged = true;

            var chainedBlock = _blocks[blockId];

            if (AllocatedBlocks.Contains(blockId) || InitialFreeBlocks.Contains(blockId))
            {
                foreach (var id in chainedBlock.BlockIds)
                {
                    FreeBlocks.Add(id);
                }
            }
            else
            {
                foreach (var id in chainedBlock.BlockIds)
                {
                    GarbageBlocks.Add(id);
                }
            }
            _blocks.Remove(blockId);
        }