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