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); }
/// <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); }