feat(memory): refactor allocation and add new queue
Refactored memory management by removing safety checks and introducing `MemoryHandle` for centralized tracking. Simplified allocation logic across allocators and enhanced `Dispose` methods for better resource cleanup. Added `UnsafeChunkedQueue<T>`, a lock-free, dynamically resizing queue with chunk-based memory management, supporting parallel producers and consumers. Updated unit tests to validate new queue functionality and ensure compatibility with refactored memory logic. Incremented assembly version to 1.6.12. BREAKING CHANGE: Removed `#if MHP_ENABLE_SAFETY_CHECKS` blocks, altering memory validation behavior.
This commit is contained in:
@@ -1,4 +1,3 @@
|
||||
using Misaki.HighPerformance.LowLevel.Utilities;
|
||||
using System.Runtime.CompilerServices;
|
||||
|
||||
namespace Misaki.HighPerformance.LowLevel.Buffer;
|
||||
@@ -14,72 +13,33 @@ public unsafe struct MemoryPool<TAllocator, TOpts> : IDisposable
|
||||
|
||||
public MemoryPool(in TOpts opts)
|
||||
{
|
||||
_pAllocator = (TAllocator*)Malloc((nuint)sizeof(TAllocator));
|
||||
*_pAllocator = TAllocator.Create(opts);
|
||||
var allocator = TAllocator.Create(opts);
|
||||
|
||||
_pAllocator = (TAllocator*)allocator.Allocate((nuint)sizeof(TAllocator), AlignOf<TAllocator>(), AllocationOption.None);
|
||||
*_pAllocator = allocator;
|
||||
|
||||
_allocationHandle = new AllocationHandle
|
||||
{
|
||||
State = _pAllocator,
|
||||
Alloc = &Allocate,
|
||||
Realloc = &Reallocate,
|
||||
Free = &Free,
|
||||
IsValid = null
|
||||
Free = &Free
|
||||
};
|
||||
}
|
||||
|
||||
private static void* Allocate(void* pAllocator, nuint size, nuint alignment, AllocationOption allocationOption
|
||||
#if MHP_ENABLE_SAFETY_CHECKS
|
||||
, MemoryHandle* pHandle
|
||||
#endif
|
||||
)
|
||||
private static void* Allocate(void* pAllocator, nuint size, nuint alignment, AllocationOption allocationOption)
|
||||
{
|
||||
var ptr = ((TAllocator*)pAllocator)->Allocate(size, alignment, allocationOption);
|
||||
#if MHP_ENABLE_SAFETY_CHECKS
|
||||
if (ptr != null)
|
||||
{
|
||||
*pHandle = AllocationManager.AddAllocation(ptr, size);
|
||||
}
|
||||
#endif
|
||||
return ptr;
|
||||
return ((TAllocator*)pAllocator)->Allocate(size, alignment, allocationOption);
|
||||
}
|
||||
|
||||
private static void* Reallocate(void* pAllocator, void* ptr, nuint oldSize, nuint newSize, nuint alignment, AllocationOption allocationOption
|
||||
#if MHP_ENABLE_SAFETY_CHECKS
|
||||
, MemoryHandle* pHandle
|
||||
#endif
|
||||
)
|
||||
private static void* Reallocate(void* pAllocator, void* ptr, nuint oldSize, nuint newSize, nuint alignment, AllocationOption allocationOption)
|
||||
{
|
||||
var newPtr = ((TAllocator*)pAllocator)->Reallocate(ptr, oldSize, newSize, alignment, allocationOption);
|
||||
#if MHP_ENABLE_SAFETY_CHECKS
|
||||
if (ptr == null && newPtr != null)
|
||||
{
|
||||
*pHandle = AllocationManager.AddAllocation(newPtr, newSize);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (newPtr == null)
|
||||
{
|
||||
AllocationManager.RemoveAllocation(*pHandle);
|
||||
}
|
||||
else
|
||||
{
|
||||
AllocationManager.UpdateAllocation(*pHandle, newPtr, newSize);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
return newPtr;
|
||||
return ((TAllocator*)pAllocator)->Reallocate(ptr, oldSize, newSize, alignment, allocationOption);
|
||||
}
|
||||
|
||||
private static void Free(void* pAllocator, void* ptr
|
||||
#if MHP_ENABLE_SAFETY_CHECKS
|
||||
, MemoryHandle handle
|
||||
#endif
|
||||
)
|
||||
private static void Free(void* pAllocator, void* ptr)
|
||||
{
|
||||
((TAllocator*)pAllocator)->Free(ptr);
|
||||
#if MHP_ENABLE_SAFETY_CHECKS
|
||||
AllocationManager.RemoveAllocation(handle);
|
||||
#endif
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
@@ -91,8 +51,6 @@ public unsafe struct MemoryPool<TAllocator, TOpts> : IDisposable
|
||||
|
||||
_pAllocator->Dispose();
|
||||
|
||||
MemoryUtility.Free(_pAllocator);
|
||||
|
||||
_pAllocator = null;
|
||||
_allocationHandle = default;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user