public bool AllocateFplBlocks() { for (int n = 0; n < this.BlockCount; n++) { KMemoryBlock block = this.Partition.Allocate(string.Format("FPL {0} block", this.Name), KAllocType.Low, 0, this.BlockSize); if (block == null) { return(false); } Blocks.Enqueue(block); FreeBlocks.Enqueue(block); } return(true); }
protected override bool AllocateBlocks() { for (int n = 0; n < GrowthCount; n++) { KMemoryBlock block = Partition.Allocate(string.Format("VPL {0} block", this.Name), KAllocType.Low, 0, BlockSize); if (block == null) { return(false); } Blocks.Enqueue(block); FreeBlocks.Enqueue(block); } return(true); }
/// <summary> /// Deletes the specified position. /// </summary> /// <param name="position">The position.</param> public void Delete(long position) { lock (_writeLock) { if (FreeBlocks.Any(fb => fb.Equals(position))) { return; } Write(position, Encoding.ASCII.GetString(new byte[MaxBlockSize])); FreeBlocks.Add(position); BlocksFree++; Save(); } }
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); }
/// <summary> /// Writes the specified value. /// </summary> /// <param name="value">The value.</param> /// <returns>System.Int64.</returns> public long Write(string value) { lock (_writeLock) { if (BlocksFree <= 0) { return(-1); } var freeBlock = FreeBlocks.First(); using (var accessor = MapFile.CreateViewAccessor(freeBlock * MaxBlockSize, MaxBlockSize)) { accessor.WriteArray(0, Encoding.ASCII.GetBytes(value), 0, value.Length); } FreeBlocks = FreeBlocks.Where(block => !block.Equals(freeBlock)).ToList(); BlocksFree--; Save(); return(freeBlock); } }
private int WriteFreeBlocks() { var freeBlocks = new HashSet <int>(FreeBlocks.Concat(GarbageBlocks).Where(x => x != 0)); if (freeBlocks.Count == 0) { return(0); } using (var memoryStream = new MemoryStream()) { using (var writer = new BinaryWriter(memoryStream)) { writer.Write(freeBlocks.Count); foreach (var freeBlock in freeBlocks) { writer.Write(freeBlock); } return(AllocateBlock(memoryStream.ToArray()).BlockId); } } }
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); }