diff options
Diffstat (limited to 'lib/Utils/src')
-rw-r--r-- | lib/Utils/src/Memory/NativeHeap.cs | 47 |
1 files changed, 13 insertions, 34 deletions
diff --git a/lib/Utils/src/Memory/NativeHeap.cs b/lib/Utils/src/Memory/NativeHeap.cs index 5fc24b5..33ab120 100644 --- a/lib/Utils/src/Memory/NativeHeap.cs +++ b/lib/Utils/src/Memory/NativeHeap.cs @@ -112,65 +112,44 @@ namespace VNLib.Utils.Memory throw; } } - - - private readonly SafeLibraryHandle LibHandle; - private AllocDelegate AllocMethod; - private ReallocDelegate ReallocMethod; - private FreeDelegate FreeMethod; - private DestroyHeapDelegate Destroy; + + private HeapMethods MethodTable; private unsafe NativeHeap(UnmanagedHeapDescriptor* flags, HeapMethods methodTable) :base(flags->InternalFlags, true) { //Store heap pointer - handle = flags->HeapPointer; - - //Store the method table - AllocMethod = methodTable.Alloc; - ReallocMethod = methodTable.Realloc; - FreeMethod = methodTable.Free; - Destroy = methodTable.Destroy; + SetHandle(flags->HeapPointer); - //Store library - LibHandle = methodTable.Library; + //Copy method table + MethodTable = methodTable; } ///<inheritdoc/> [MethodImpl(MethodImplOptions.AggressiveInlining)] - protected override IntPtr AllocBlock(nuint elements, nuint size, bool zero) => AllocMethod(handle, elements, size, zero); + protected override IntPtr AllocBlock(nuint elements, nuint size, bool zero) => MethodTable.Alloc(handle, elements, size, zero); ///<inheritdoc/> [MethodImpl(MethodImplOptions.AggressiveInlining)] - protected override IntPtr ReAllocBlock(IntPtr block, nuint elements, nuint size, bool zero) => ReallocMethod(handle, block, elements, size, zero); + protected override IntPtr ReAllocBlock(IntPtr block, nuint elements, nuint size, bool zero) => MethodTable.Realloc(handle, block, elements, size, zero); ///<inheritdoc/> [MethodImpl(MethodImplOptions.AggressiveInlining)] - protected override bool FreeBlock(IntPtr block) => FreeMethod(handle, block); + protected override bool FreeBlock(IntPtr block) => MethodTable.Free(handle, block); ///<inheritdoc/> protected override bool ReleaseHandle() { //Destroy the heap - bool ret = Destroy(handle); - - //Cleanup the method table - Cleanup(); + bool ret = MethodTable.Destroy(handle); //Free the library - LibHandle.Dispose(); + MethodTable.Library.Dispose(); - return ret; - } + //Cleanup the method table + MethodTable = default; -#nullable disable - private void Cleanup() - { - AllocMethod = null; - ReallocMethod = null; - FreeMethod = null; - Destroy = null; + return ret; } -#nullable enable /* * Delegate methods match the native header impl for unmanaged heaps |