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