Ejemplo n.º 1
0
 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);
 }
Ejemplo n.º 2
0
 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);
 }
Ejemplo n.º 3
0
 /// <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();
     }
 }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
        /// <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);
            }
        }
Ejemplo n.º 6
0
        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);
                }
            }
        }
Ejemplo n.º 7
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);
        }