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); }
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); }