mirror of
https://github.com/ToyB-Chan/minimal-heap.git
synced 2026-07-13 21:51:16 +02:00
moved segment/payload hopping to seperate functions
This commit is contained in:
@@ -69,9 +69,8 @@ typedef struct _MIHP_HeapMemoryAreaHeader
|
|||||||
struct _MIHP_HeapMemoryAreaHeader* NextArea;
|
struct _MIHP_HeapMemoryAreaHeader* NextArea;
|
||||||
struct _MIHP_HeapMemoryAreaHeader* PreviousArea;
|
struct _MIHP_HeapMemoryAreaHeader* PreviousArea;
|
||||||
|
|
||||||
struct _MIHP_Heap* OwningHeap;
|
struct _MIHP_Heap* OwningHeap;
|
||||||
struct _MIHP_HeapSegmentHeader* FirstSegment;
|
struct _MIHP_HeapSegmentHeader* FirstSegment;
|
||||||
|
|
||||||
|
|
||||||
uint32_t Checksum; // Checksum must be the last member !
|
uint32_t Checksum; // Checksum must be the last member !
|
||||||
} MIHP_HeapMemoryAreaHeader;
|
} MIHP_HeapMemoryAreaHeader;
|
||||||
@@ -134,6 +133,9 @@ bool MIHP_UninitializeHeapSegment(MIHP_HeapSegmentHeader* segment);
|
|||||||
bool MIHP_SplitHeapSegment(MIHP_HeapSegmentHeader* sourceSegment, size_t newSegmentSize, MIHP_HeapSegmentHeader** outNewSegment);
|
bool MIHP_SplitHeapSegment(MIHP_HeapSegmentHeader* sourceSegment, size_t newSegmentSize, MIHP_HeapSegmentHeader** outNewSegment);
|
||||||
bool MIHP_MergeHeapSegments(MIHP_HeapSegmentHeader* sourceSegment, MIHP_HeapSegmentHeader* segmentToAbsorb);
|
bool MIHP_MergeHeapSegments(MIHP_HeapSegmentHeader* sourceSegment, MIHP_HeapSegmentHeader* segmentToAbsorb);
|
||||||
|
|
||||||
|
void* MIHP_GetSegmentPayloadPtr(MIHP_Heap* heap, MIHP_HeapSegmentHeader* segment);
|
||||||
|
MIHP_HeapSegmentHeader* MIHP_GetSegmentHeaderPtr(MIHP_Heap* heap, void* payloadPtr);
|
||||||
|
|
||||||
size_t MIHP_GetHeapAlignedSize(const MIHP_Heap* heap, size_t size);
|
size_t MIHP_GetHeapAlignedSize(const MIHP_Heap* heap, size_t size);
|
||||||
|
|
||||||
uint32_t MIHP_HashMemoryRegion(const void* data, size_t size);
|
uint32_t MIHP_HashMemoryRegion(const void* data, size_t size);
|
||||||
|
|||||||
@@ -108,7 +108,7 @@ void* MIHP_Allocate(MIHP_Heap* heap, size_t size)
|
|||||||
{
|
{
|
||||||
MIHP_HeapSegmentHeader* currentSegment = nextSegment;
|
MIHP_HeapSegmentHeader* currentSegment = nextSegment;
|
||||||
MIHP_ValidateHeapSegmentHeader(heap, currentSegment);
|
MIHP_ValidateHeapSegmentHeader(heap, currentSegment);
|
||||||
nextSegment = currentSegment->NextSegment;
|
nextSegment = nextSegment->NextSegment;
|
||||||
|
|
||||||
if (currentSegment->OccupiedSize != 0)
|
if (currentSegment->OccupiedSize != 0)
|
||||||
continue;
|
continue;
|
||||||
@@ -134,7 +134,7 @@ void* MIHP_Allocate(MIHP_Heap* heap, size_t size)
|
|||||||
|
|
||||||
MIHP_UNLOCK_HEAP(&heap->HeapLock);
|
MIHP_UNLOCK_HEAP(&heap->HeapLock);
|
||||||
|
|
||||||
void* data = (char*)targetSegment + segmentHeaderSize;
|
void* data = MIHP_GetSegmentPayloadPtr(heap, targetSegment);
|
||||||
MIHP_MEMSET(data, size, heap->Config.AllocationInitialValue);
|
MIHP_MEMSET(data, size, heap->Config.AllocationInitialValue);
|
||||||
|
|
||||||
return data;
|
return data;
|
||||||
@@ -181,10 +181,10 @@ void* MIHP_Realloc(MIHP_Heap* heap, void* ptr, size_t newSize)
|
|||||||
|
|
||||||
MIHP_LOCK_HEAP(&heap->HeapLock);
|
MIHP_LOCK_HEAP(&heap->HeapLock);
|
||||||
|
|
||||||
size_t segmentHeaderSize = MIHP_GetHeapAlignedSize(heap, sizeof(MIHP_HeapSegmentHeader));
|
MIHP_HeapSegmentHeader* segment = MIHP_GetSegmentHeaderPtr(heap, ptr);
|
||||||
MIHP_HeapSegmentHeader* segment = (MIHP_HeapSegmentHeader*)((char*)ptr - segmentHeaderSize);
|
|
||||||
MIHP_ValidateHeapSegmentHeader(heap, segment);
|
MIHP_ValidateHeapSegmentHeader(heap, segment);
|
||||||
|
|
||||||
|
size_t segmentHeaderSize = MIHP_GetHeapAlignedSize(heap, sizeof(MIHP_HeapSegmentHeader));
|
||||||
if (newSize > segment->OccupiedSize)
|
if (newSize > segment->OccupiedSize)
|
||||||
{
|
{
|
||||||
size_t maxPayloadSize = segment->SegmentSize - segmentHeaderSize;
|
size_t maxPayloadSize = segment->SegmentSize - segmentHeaderSize;
|
||||||
@@ -253,8 +253,7 @@ bool MIHP_Free(MIHP_Heap* heap, void* ptr)
|
|||||||
|
|
||||||
MIHP_LOCK_HEAP(&heap->HeapLock);
|
MIHP_LOCK_HEAP(&heap->HeapLock);
|
||||||
|
|
||||||
size_t segmentHeaderSize = MIHP_GetHeapAlignedSize(heap, sizeof(MIHP_HeapSegmentHeader));
|
MIHP_HeapSegmentHeader* segment = MIHP_GetSegmentHeaderPtr(heap, ptr);
|
||||||
MIHP_HeapSegmentHeader* segment = (MIHP_HeapSegmentHeader*)((char*)ptr - segmentHeaderSize);
|
|
||||||
MIHP_ValidateHeapSegmentHeader(heap, segment);
|
MIHP_ValidateHeapSegmentHeader(heap, segment);
|
||||||
|
|
||||||
MIHP_HeapMemoryAreaHeader* area = segment->OwningMemoryArea;
|
MIHP_HeapMemoryAreaHeader* area = segment->OwningMemoryArea;
|
||||||
@@ -536,6 +535,22 @@ bool MIHP_MergeHeapSegments(MIHP_HeapSegmentHeader* sourceSegment, MIHP_HeapSegm
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void* MIHP_GetSegmentPayloadPtr(MIHP_Heap* heap, MIHP_HeapSegmentHeader* segment)
|
||||||
|
{
|
||||||
|
MIHP_ASSERT(heap);
|
||||||
|
MIHP_ASSERT(segment);
|
||||||
|
|
||||||
|
return (char*)segment + MIHP_GetHeapAlignedSize(heap, sizeof(MIHP_HeapSegmentHeader));
|
||||||
|
}
|
||||||
|
|
||||||
|
MIHP_HeapSegmentHeader* MIHP_GetSegmentHeaderPtr(MIHP_Heap* heap, void* payloadPtr)
|
||||||
|
{
|
||||||
|
MIHP_ASSERT(heap);
|
||||||
|
MIHP_ASSERT(payloadPtr);
|
||||||
|
|
||||||
|
return (MIHP_HeapSegmentHeader*)((char*)payloadPtr - MIHP_GetHeapAlignedSize(heap, sizeof(MIHP_HeapSegmentHeader)));
|
||||||
|
}
|
||||||
|
|
||||||
size_t MIHP_GetHeapAlignedSize(const MIHP_Heap* heap, size_t size)
|
size_t MIHP_GetHeapAlignedSize(const MIHP_Heap* heap, size_t size)
|
||||||
{
|
{
|
||||||
return (size + (heap->Config.AllocationAlignment - 1)) & ~(heap->Config.AllocationAlignment - 1);
|
return (size + (heap->Config.AllocationAlignment - 1)) & ~(heap->Config.AllocationAlignment - 1);
|
||||||
|
|||||||
Reference in New Issue
Block a user