Example #1
0
        public MemArena DeAllocate(MemArena arena)
        {
            if (arena.IsFree)
            {
                return(arena);
            }

            uint freedMem = arena.Capacity;

            arena.View.MyFreeSpace += arena.Capacity;
            arena.IsFree            = true;
            arena        = MemArena.CoalesceAdjacent(arena);
            arena.IsFree = true;

            FreeSpace = MyFreeSpace - (uint)MemArena.Header.Size;
            //CalculateArenaMemoryUsage(); removing it..

            Usage++;

            return(arena);
        }
Example #2
0
        /// <summary>
        ///
        /// </summary>
        /// <returns></returns>
        public MemArena DeFragment()
        {
            MemArena lastArena = FirstArena();

            do
            {
                MemArena current = lastArena.NextArena();
                if (current == null)
                {
                    break;
                }

                // If the last arena is used we dont need to swap it down.
                if (!lastArena.IsFree)
                {
                    lastArena = current;
                    continue;
                }

                // Two consecutive free arenas, rare, but taken care of!
                if (current.IsFree)
                {
                    lastArena = MemArena.CoalesceAdjacent(current);
                }
                else
                {
                    // A free arena followed by a used one so we swap down the free one.
                    MemArena.SwapAdjacent(current, lastArena);
                    lastArena = current;
                }
            }while (true);

            this.FreeSpace    = lastArena.Capacity;
            this.MaxFreeSpace = lastArena.Capacity;
            CalculateArenaMemoryUsage(); //may be we need it here.. very low frequency of this to be called..
            return(lastArena);
        }