示例#1
0
        private HashSet <int> ReadFreeBlocks()
        {
            var blockId = MasterBlockData.FreeListBlockId;

            if (blockId == 0)
            {
                return(new HashSet <int>());
            }

            var chainedBlock = ReadChainedBlock(blockId);
            var blocks       = new HashSet <int>();

            using (var memoryStream = new MemoryStream(chainedBlock.Data, false))
            {
                using (var reader = new BinaryReader(memoryStream))
                {
                    var count = reader.ReadInt32();
                    for (var i = 0; i < count; ++i)
                    {
                        blocks.Add(reader.ReadInt32());
                    }
                }
            }

            // The current blocks holding the free list must not be overwritten in this session
            foreach (var id in chainedBlock.BlockIds)
            {
                GarbageBlocks.Add(id);
                blocks.Remove(id);
            }

            return(blocks);
        }
示例#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);
        }