From 63a447d1c44a2ad32fe085c52e7c0b57191d39fd Mon Sep 17 00:00:00 2001 From: ToyB-Chan Date: Tue, 9 Jun 2026 00:39:10 +0200 Subject: [PATCH 1/3] moved segment/payload hopping to seperate functions --- minimal_heap.h | 8 +++++--- minimal_heap_implementation.inl | 27 +++++++++++++++++++++------ 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/minimal_heap.h b/minimal_heap.h index 27b6cda..1a194d6 100644 --- a/minimal_heap.h +++ b/minimal_heap.h @@ -69,9 +69,8 @@ typedef struct _MIHP_HeapMemoryAreaHeader struct _MIHP_HeapMemoryAreaHeader* NextArea; struct _MIHP_HeapMemoryAreaHeader* PreviousArea; - struct _MIHP_Heap* OwningHeap; - struct _MIHP_HeapSegmentHeader* FirstSegment; - + struct _MIHP_Heap* OwningHeap; + struct _MIHP_HeapSegmentHeader* FirstSegment; uint32_t Checksum; // Checksum must be the last member ! } 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_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); uint32_t MIHP_HashMemoryRegion(const void* data, size_t size); diff --git a/minimal_heap_implementation.inl b/minimal_heap_implementation.inl index 78dd93a..01e0a88 100644 --- a/minimal_heap_implementation.inl +++ b/minimal_heap_implementation.inl @@ -108,7 +108,7 @@ void* MIHP_Allocate(MIHP_Heap* heap, size_t size) { MIHP_HeapSegmentHeader* currentSegment = nextSegment; MIHP_ValidateHeapSegmentHeader(heap, currentSegment); - nextSegment = currentSegment->NextSegment; + nextSegment = nextSegment->NextSegment; if (currentSegment->OccupiedSize != 0) continue; @@ -134,7 +134,7 @@ void* MIHP_Allocate(MIHP_Heap* heap, size_t size) MIHP_UNLOCK_HEAP(&heap->HeapLock); - void* data = (char*)targetSegment + segmentHeaderSize; + void* data = MIHP_GetSegmentPayloadPtr(heap, targetSegment); MIHP_MEMSET(data, size, heap->Config.AllocationInitialValue); return data; @@ -181,10 +181,10 @@ void* MIHP_Realloc(MIHP_Heap* heap, void* ptr, size_t newSize) MIHP_LOCK_HEAP(&heap->HeapLock); - size_t segmentHeaderSize = MIHP_GetHeapAlignedSize(heap, sizeof(MIHP_HeapSegmentHeader)); - MIHP_HeapSegmentHeader* segment = (MIHP_HeapSegmentHeader*)((char*)ptr - segmentHeaderSize); + MIHP_HeapSegmentHeader* segment = MIHP_GetSegmentHeaderPtr(heap, ptr); MIHP_ValidateHeapSegmentHeader(heap, segment); + size_t segmentHeaderSize = MIHP_GetHeapAlignedSize(heap, sizeof(MIHP_HeapSegmentHeader)); if (newSize > segment->OccupiedSize) { size_t maxPayloadSize = segment->SegmentSize - segmentHeaderSize; @@ -253,8 +253,7 @@ bool MIHP_Free(MIHP_Heap* heap, void* ptr) MIHP_LOCK_HEAP(&heap->HeapLock); - size_t segmentHeaderSize = MIHP_GetHeapAlignedSize(heap, sizeof(MIHP_HeapSegmentHeader)); - MIHP_HeapSegmentHeader* segment = (MIHP_HeapSegmentHeader*)((char*)ptr - segmentHeaderSize); + MIHP_HeapSegmentHeader* segment = MIHP_GetSegmentHeaderPtr(heap, ptr); MIHP_ValidateHeapSegmentHeader(heap, segment); MIHP_HeapMemoryAreaHeader* area = segment->OwningMemoryArea; @@ -536,6 +535,22 @@ bool MIHP_MergeHeapSegments(MIHP_HeapSegmentHeader* sourceSegment, MIHP_HeapSegm 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) { return (size + (heap->Config.AllocationAlignment - 1)) & ~(heap->Config.AllocationAlignment - 1); From 8f737acc1a81c3b97bbdc6acfbc2cd3241718e0c Mon Sep 17 00:00:00 2001 From: ToyB-Chan Date: Tue, 9 Jun 2026 00:39:29 +0200 Subject: [PATCH 2/3] Update minimal_heap.h --- minimal_heap.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/minimal_heap.h b/minimal_heap.h index 1a194d6..d83a04a 100644 --- a/minimal_heap.h +++ b/minimal_heap.h @@ -1,4 +1,4 @@ -/* Version 1.3 */ +/* Version 1.3b */ #ifndef __MINIMAL_HEAP_H__ #define __MINIMAL_HEAP_H__ From 667b359eec5674a7dd5f493da69e1f04ca13ccb2 Mon Sep 17 00:00:00 2001 From: ToyB-Chan Date: Tue, 9 Jun 2026 00:40:57 +0200 Subject: [PATCH 3/3] Update minimal_heap_test.c --- minimal_heap_test.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/minimal_heap_test.c b/minimal_heap_test.c index 1f6f4af..3048126 100644 --- a/minimal_heap_test.c +++ b/minimal_heap_test.c @@ -7,7 +7,7 @@ #define USE_MALLOC 0 -#define MIHP_ValidateHeap(x) +//#define MIHP_ValidateHeap(x) void* MIHP_PlatformRequestMemory(const MIHP_Heap* heap, size_t minRequestedSize, size_t* outActualSize) {