private long AllocBlock(FileBlock block, BlockFlags type) { using (new SafeLock(_syncFreeBlock)) { long blockId = _nextFree; if (blockId == 0 && _reallocSize > 0) { long fsize; using (Stream s = _streamCache.Open(FileAccess.Read)) fsize = LastAllocated(s); ResizeFile(fsize + _blockSize, fsize + _reallocSize); blockId = _nextFree; } if (blockId <= 0) { throw new IOException(); } using (Stream io = OpenBlock(FileAccess.Read, blockId)) block.Read(io, FileBlock.HeaderSize); if ((block.BlockId & _maskOffset) != (blockId & _maskOffset) || (block.Flags & BlockFlags.BlockDeleted) == 0) { throw new InvalidDataException(); } _nextFree = block.NextBlockId; block.BlockId = blockId; block.IncrementId(_maskVersion); block.NextBlockId = 0; block.Flags = type == BlockFlags.ExternalBlock ? (type | BlockFlags.Temporary) : type; block.Length = 0; WriteBlock(block.BlockId, block, FileBlock.HeaderSize); return(block.BlockId); } }
private long AllocBlock(FileBlock block, BlockFlags type) { using (new SafeLock(_syncFreeBlock)) { long blockId = _nextFree; if (blockId == 0 && _reallocSize > 0) { long fsize; using (Stream s = _streamCache.Open(FileAccess.Read)) fsize = LastAllocated(s); ResizeFile(fsize + _blockSize, fsize + _reallocSize); blockId = _nextFree; } if (blockId <= 0) throw new IOException(); using (Stream io = OpenBlock(FileAccess.Read, blockId)) block.Read(io, FileBlock.HeaderSize); if ((block.BlockId & _maskOffset) != (blockId & _maskOffset) || (block.Flags & BlockFlags.BlockDeleted) == 0) throw new InvalidDataException(); _nextFree = block.NextBlockId; block.BlockId = blockId; block.IncrementId(_maskVersion); block.NextBlockId = 0; block.Flags = type == BlockFlags.ExternalBlock ? (type | BlockFlags.Temporary) : type; block.Length = 0; WriteBlock(block.BlockId, block, FileBlock.HeaderSize); return block.BlockId; } }