Beispiel #1
0
        /// <summary>
        /// Reserves a heap's chunk and returns a pointer to this area.
        /// </summary>
        /// <param name="newPointer">Number of bytes to reserve.</param>
        /// <returns>An handle to the reserved area.</returns>
        protected virtual MemoryPointer Alloc(MemoryPointer newPointer)
        {
            // - Iterate over the free spaces
            for (int i = FreeSpace.Count - 1; i >= 0; --i)
            {
                var freeChunk = FreeSpace[i];

                // - If we found a suitable free space
                if (freeChunk.Size >= newPointer.Size)
                {
                    // - Set the position to the current free chunk
                    newPointer.ChangeOffsetAndSize(freeChunk.Offset, newPointer.Size);

                    // - Calculates the remaining space
                    uint remainingSpace = freeChunk.Size - newPointer.Size;

                    // - If no memory remains in the free space pointer we must delete it
                    if (remainingSpace <= 0)
                    {
                        FreeSpace.Remove(freeChunk);
                    }
                    else
                    {
                        freeChunk.ChangeOffsetAndSize(newPointer.Offset + newPointer.Size, remainingSpace);
                    }

                    // - Adds the new pointer to the used space
                    UsedSpace.Add(newPointer);

                    // - Sort used space
                    UsedSpace.OrderBy(x => x.Offset);

                    // - Update fragmentation factor
                    FragmentationFactor = CalculateFragmentationRate();

                    return(newPointer);
                }
            }

            // - Expand the heap
            if (!Grow(newPointer.Size))
            {
                Defrag();

                if (FreeSpace.Count > 0 && FreeSpace.Last().Size > newPointer.Size)
                {
                    return(Alloc(newPointer));
                }

                return(null);
            }

            return(Alloc(newPointer));
        }
Beispiel #2
0
 public bool IsCorr(int startedlength, int stoppedlength, int heigth)
 {
     for (int component = startedlength; component <= stoppedlength - 1; component++)
     {
         if (!UsedSpace.Any(item
                            => item.Contains($"{ShipStart[0].Name}{component + 1}{heigth}")))
         {
             TemporaryPlaces.Add($"{ShipStart[0].Name}{component}{heigth}");
         }
         else
         {
             TemporaryPlaces.Clear();
             return(false);
         }
     }
     foreach (var Model in TemporaryPlaces)
     {
         UsedSpace.Add($"{Model}");
         ShipPlaces.Add($"{Model}");
     }
     TemporaryPlaces.Clear();
     return(true);
 }