moved segment/payload hopping to seperate functions

This commit is contained in:
2026-06-09 00:39:10 +02:00
parent fa1eb41719
commit 63a447d1c4
2 changed files with 26 additions and 9 deletions

View File

@@ -72,7 +72,6 @@ typedef struct _MIHP_HeapMemoryAreaHeader
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);

View File

@@ -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);