using System; using System.Linq; using System.Threading.Tasks; using Native = System.UInt32; namespace Cosmos.Core.Memory { /// /// Heap class. /// public static unsafe class Heap { /// /// Init heap. /// /// Thrown on fatal error, contact support. public static void Init() { HeapSmall.Init(); HeapMedium.Init(); HeapLarge.Init(); } /// /// Alloc memory block, of a given size. /// /// A size of block to alloc, in bytes. /// Byte pointer to the start of the block. public static byte* Alloc(Native aSize) { if (aSize <= HeapSmall.mMaxItemSize) { return HeapSmall.Alloc(aSize); } else if (aSize <= HeapMedium.MaxItemSize) { return HeapMedium.Alloc(aSize); } else { return HeapLarge.Alloc(aSize); } } // Keep as void* and not byte* or other. Reduces typecasting from callers // who may have typed the pointer to their own needs. /// /// Free a heap item. /// /// A pointer to the heap item to be freed. /// Thrown if: /// /// Page type is not found. /// Heap item not found in RAT. /// /// public static void Free(void* aPtr) { //TODO find a better way to remove the double look up here for GetPageType and then again in the // .Free methods which actually free the entries in the RAT. var xType = RAT.GetPageType(aPtr); switch (xType) { case RAT.PageType.HeapLarge: HeapLarge.Free(aPtr); break; default: throw new Exception("Heap item not found in RAT."); } } } }