/// <summary> /// Constructs an allocator. /// </summary> /// <param name="budgetInBytes">Budget of the allocator in bytes.</param> /// <param name="bufferSizeInBytes">Size of each buffer to be allocated in bytes.</param> /// <param name="handle">An AllocatorHandle to use for internal bookkeeping structures.</param> /// <exception cref="InvalidOperationException">Thrown if the allocator cannot reserve the address range required for the given budget.</exception> public BufferAllocator(int budgetInBytes, int bufferSizeInBytes, AllocatorManager.AllocatorHandle handle) { BufferSizeInBytes = bufferSizeInBytes; // Reserve the entire budget's worth of address space. The reserved space may be larger than the budget // due to page sizes. var pageCount = VirtualMemoryUtility.BytesToPageCount((uint)budgetInBytes, VirtualMemoryUtility.DefaultPageSizeInBytes); BaselibErrorState errorState; ReservedRange = VirtualMemoryUtility.ReserveAddressSpace(pageCount, VirtualMemoryUtility.DefaultPageSizeInBytes, out errorState); #if ENABLE_UNITY_COLLECTIONS_CHECKS if (!errorState.Success) { throw new InvalidOperationException($"Failed to reserve address range for {budgetInBytes} bytes"); } #endif // Init a free list of blocks. MaxBufferCount = (int)VirtualMemoryUtility.BytesToPageCount((uint)budgetInBytes, (uint)bufferSizeInBytes); FreeList = new UnsafeIntList(MaxBufferCount, handle); for (int i = MaxBufferCount - 1; i >= 0; --i) { FreeList.Add(i); } }