Exemplo n.º 1
0
        /// <summary>
        /// Desfragmenta.
        /// </summary>
        /// <returns></returns>
        public MemArea DeFragment()
        {
            MemArea arena2;
            MemArea arena = this.FirstArea();

            arena2 = arena.NextArea();
            while (arena2 != null)
            {
                if (!arena.IsFree)
                {
                    arena = arena2;
                }
                else if (arena2.IsFree)
                {
                    arena = MemArea.CoalesceAdjacent(arena2);
                }
                else
                {
                    MemArea.SwapAdjacent(arena2, arena);
                    arena = arena2;
                }
                arena2 = arena.NextArea();
            }
            this.FreeSpace    = arena.Capacity;
            this.MaxFreeSpace = arena.Capacity;
            this.CalculateAreaMemoryUsage();
            return(arena);
        }
Exemplo n.º 2
0
 /// <summary>
 /// Adquire uma area adjacente.
 /// </summary>
 /// <param name="area"></param>
 /// <returns></returns>
 internal static MemArea CoalesceAdjacent(MemArea area)
 {
     if (area.IsFree)
     {
         MemArea arenaCopy = area.NextArea();
         int     num       = 0;
         if (arenaCopy != null)
         {
             uint num2 = 0;
             while ((arenaCopy != null) && arenaCopy.IsFree)
             {
                 num++;
                 num2     += arenaCopy.TotalLength;
                 arenaCopy = arenaCopy.NextArea();
             }
             if (num2 > 0)
             {
                 area.Capacity += num2;
                 uint capacity = area.Capacity;
                 area          = SetNextArea(area, GetActualArea(arenaCopy));
                 area.Capacity = capacity;
             }
         }
         if (area.HasPrevious)
         {
             uint    num4   = 0;
             MemArea arena3 = area;
             MemArea arena4 = null;
             while (true)
             {
                 arena4 = arena3.PreviousArea();
                 if ((arena4 == null) || !arena4.IsFree)
                 {
                     break;
                 }
                 num4  += arena4.TotalLength;
                 arena3 = arena4;
                 num++;
             }
             if (num4 > 0)
             {
                 area.Capacity += num4;
                 uint num5 = area.Capacity;
                 area.NextArea();
                 area          = SetNextArea(arena3, GetActualArea(arenaCopy));
                 area.Capacity = num5;
             }
         }
         if (num > 0)
         {
             View view = area.View;
             view.MyFreeSpace += (uint)(num * Header.Size);
         }
     }
     return(area);
 }
Exemplo n.º 3
0
        /// <summary>
        /// Divida a <see cref="MemArea"/> em partes com o tamanhon informado.
        /// </summary>
        /// <param name="area"></param>
        /// <param name="size"></param>
        /// <returns></returns>
        internal static MemArea SplitArea(MemArea area, uint size)
        {
            uint num = size + ((uint)Header.Size);

            if (area.OffsetNext != 0)
            {
                area.Capacity = area.OffsetNext - (area.Offset + ((uint)Header.Size));
            }
            if (num > area.Capacity)
            {
                return(null);
            }
            uint num2 = (area.Capacity - size) - ((uint)Header.Size);

            if (num2 < SPLIT_THRESHOLD)
            {
                View view1 = area.View;
                view1.MyFreeSpace -= area.Capacity + ((uint)Header.Size);
                return(area);
            }
            area.Capacity = size;
            MemArea arena2 = area.View.AreaAtOffset(area.Offset + area.TotalLength);

            arena2.Capacity = num2;
            View view = area.View;

            view.MyFreeSpace -= num;
            MemArea arenaCopy = area.NextArea();

            SetNextArea(arena2, GetActualArea(arenaCopy));
            SetNextArea(area, arena2);
            return(arena2);
        }
Exemplo n.º 4
0
 /// <summary>
 /// Move para o próximo item.
 /// </summary>
 /// <returns></returns>
 bool IEnumerator.MoveNext()
 {
     if (_view == null)
     {
         return(false);
     }
     _storage._viewManager.OpenView(_view);
     if (_area == null)
     {
         _area = _view.FirstArea();
     }
     else
     {
         _area = _area.NextArea();
         if (_area == null)
         {
             _view = _storage._viewManager.GetViewByID(_view.ID + 1);
             if (_view != null)
             {
                 _storage._viewManager.OpenView(_view);
                 _area = _view.FirstArea();
             }
         }
     }
     return(_area != null);
 }
Exemplo n.º 5
0
        /// <summary>
        /// Calcula a area da memória usada.
        /// </summary>
        private void CalculateAreaMemoryUsage()
        {
            MemArea arena    = this.FirstArea();
            MemArea arena2   = this.FirstArea();
            uint    capacity = 0;
            uint    num2     = 0;

            while (arena != null)
            {
                try
                {
                    if (arena.IsFree)
                    {
                        num2 += arena.Capacity;
                        if (arena.Capacity >= capacity)
                        {
                            capacity = arena.Capacity;
                        }
                    }
                    arena = arena.NextArea();
                    if ((arena != null) && (arena.OffsetNext == arena2.Offset))
                    {
                        arena.OffsetNext = 0;
                    }
                    continue;
                }
                catch (Exception exception)
                {
                    throw new Exception(exception.Message);
                }
            }
            this.FreeSpace    = num2;
            this.MaxFreeSpace = capacity;
            this.MyFreeSpace  = this.FreeSpace + ((uint)MemArea.Header.Size);
        }
Exemplo n.º 6
0
        /// <summary>
        /// Recupera o texto que representa a instancia.
        /// </summary>
        /// <returns></returns>
        public override string ToString()
        {
            StringBuilder builder = new StringBuilder();

            builder.Append("View, ID=").Append(this.ID).Append(", maxFree=").Append(this.MaxFreeSpace).Append(", Free=").Append(this.FreeSpace).Append("\r\n");
            if (this.IsOpen)
            {
                for (MemArea arena = this.FirstArea(); arena != null; arena = arena.NextArea())
                {
                    builder.Append(arena.ToString()).Append("\r\n");
                }
            }
            return(builder.ToString());
        }
Exemplo n.º 7
0
        /// <summary>
        /// Procura pela primeira <see cref="MemArea"/> livre.
        /// </summary>
        /// <param name="memRequirements">Quantidade de memória requerida.</param>
        /// <returns><see cref="MemArea"/> disponível.</returns>
        private MemArea FindFirstFreeArena(uint memRequirements)
        {
            memRequirements += (uint)MemArea.Header.Size;
            MemArea arena = this.FirstArea();

            if (arena.OffsetNext != 0)
            {
                arena.Capacity = arena.OffsetNext - (arena.Offset + ((uint)MemArea.Header.Size));
            }
            if (((_lastFreeArena == null) || !_lastFreeArena.IsFree) || (_lastFreeArena.Capacity < memRequirements))
            {
                while (arena != null)
                {
                    if (arena.IsFree && (arena.Capacity >= memRequirements))
                    {
                        return(arena);
                    }
                    arena = arena.NextArea();
                }
                return(null);
            }
            return(_lastFreeArena);
        }