mirror of
https://github.com/ToyB-Chan/minimal-heap.git
synced 2026-07-13 21:51:16 +02:00
changed the way allocation sizes are calculated (☠)
This commit is contained in:
@@ -156,12 +156,13 @@ void* MIHP_Allocate(MIHP_Heap* heap, size_t size)
|
||||
size_t segmentHeaderSize = MIHP_GetHeapAlignedSize(heap, sizeof(MIHP_HeapSegmentHeader));
|
||||
MIHP_HeapSegmentHeader* targetSegment = NULL;
|
||||
|
||||
if (currentSegment->SegmentSize >= 2 * segmentHeaderSize + size + MIHP_GetMinimalPayloadSize(heap))
|
||||
MIHP_SplitHeapSegment(heap, currentSegment, segmentHeaderSize + size, &targetSegment);
|
||||
else if (currentSegment->SegmentSize >= segmentHeaderSize + size)
|
||||
targetSegment = currentSegment;
|
||||
else
|
||||
continue;
|
||||
if (!MIHP_SplitHeapSegment(heap, currentSegment, segmentHeaderSize + size, &targetSegment))
|
||||
{
|
||||
if (currentSegment->SegmentSize >= segmentHeaderSize + size)
|
||||
targetSegment = currentSegment;
|
||||
else
|
||||
continue;
|
||||
}
|
||||
|
||||
targetSegment->OccupiedSize = size;
|
||||
targetSegment->Checksum = MIHP_GenerateHeapSegmentChecksum(heap, targetSegment);
|
||||
@@ -274,15 +275,13 @@ void* MIHP_Reallocate(MIHP_Heap* heap, void* ptr, size_t newSize)
|
||||
segment->Checksum = MIHP_GenerateHeapSegmentChecksum(heap, segment);
|
||||
|
||||
size_t alignedNewSize = MIHP_GetHeapAlignedSize(heap, newSize);
|
||||
if (segment->SegmentSize > 2 * segmentHeaderSize + alignedNewSize + MIHP_GetMinimalPayloadSize(heap))
|
||||
{
|
||||
size_t newSplitSegmentSize = segment->SegmentSize - segmentHeaderSize - alignedNewSize;
|
||||
size_t newSplitSegmentSize = segment->SegmentSize - segmentHeaderSize - alignedNewSize;
|
||||
|
||||
MIHP_HeapSegmentHeader* newSpittedSegment = NULL;
|
||||
MIHP_SplitHeapSegment(heap, segment, newSplitSegmentSize, &newSpittedSegment);
|
||||
if (newSpittedSegment && newSpittedSegment->NextSegment)
|
||||
MIHP_MergeHeapSegments(heap, newSpittedSegment, newSpittedSegment->NextSegment); // Try directly merging with the adjacent segment
|
||||
}
|
||||
MIHP_HeapSegmentHeader* newSpittedSegment = NULL;
|
||||
MIHP_SplitHeapSegment(heap, segment, newSplitSegmentSize, &newSpittedSegment);
|
||||
|
||||
if (newSpittedSegment && newSpittedSegment->NextSegment)
|
||||
MIHP_MergeHeapSegments(heap, newSpittedSegment, newSpittedSegment->NextSegment); // Try directly merging with the adjacent segment
|
||||
|
||||
MIHP_UnlockHeap(heap);
|
||||
return ptr;
|
||||
@@ -609,6 +608,8 @@ bool MIHP_SplitHeapSegment(MIHP_Heap* heap, MIHP_HeapSegmentHeader* sourceSegmen
|
||||
MIHP_ASSERT(sourceSegment);
|
||||
|
||||
size_t headerSize = MIHP_GetHeapAlignedSize(heap, sizeof(MIHP_HeapSegmentHeader));
|
||||
newSegmentMinSize = MIHP_MAX(MIHP_GetMinimalPayloadSize(heap) + headerSize, newSegmentMinSize);
|
||||
|
||||
size_t effectiveNewSegmentSize = MIHP_GetHeapAlignedSize(heap, newSegmentMinSize);
|
||||
|
||||
if (sourceSegment->SegmentSize < effectiveNewSegmentSize)
|
||||
@@ -616,6 +617,9 @@ bool MIHP_SplitHeapSegment(MIHP_Heap* heap, MIHP_HeapSegmentHeader* sourceSegmen
|
||||
|
||||
size_t sourceResultingSegmentSize = sourceSegment->SegmentSize - effectiveNewSegmentSize;
|
||||
|
||||
if (sourceResultingSegmentSize < MIHP_GetMinimalPayloadSize(heap) + headerSize)
|
||||
return false;
|
||||
|
||||
if (sourceResultingSegmentSize < sourceSegment->OccupiedSize + headerSize)
|
||||
return false;
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ void OnHeapCorruptionDetectedCallback(const MIHP_Heap* heap, MIHP_HeapCorruption
|
||||
__debugbreak();
|
||||
}
|
||||
|
||||
#define NUM_ALLOCATIONS (4096 * 4096)
|
||||
#define NUM_ALLOCATIONS (4096 * 4)
|
||||
|
||||
void* myptrs[NUM_ALLOCATIONS] = { 0 };
|
||||
|
||||
@@ -38,14 +38,14 @@ int main()
|
||||
config.PlatformFreeMemoryFn = FreeMemory;
|
||||
config.OnHeapCorruptionDetectedFn = OnHeapCorruptionDetectedCallback;
|
||||
|
||||
config.HeapValidationMode = MIHP_HVM_None;
|
||||
config.HeapValidationMode = MIHP_HVM_Checksum;
|
||||
|
||||
MIHP_Heap myHeap = { 0 };
|
||||
MIHP_InitializeHeap(&myHeap, config);
|
||||
|
||||
for (int i = 0; i < NUM_ALLOCATIONS; i++)
|
||||
{
|
||||
size_t size = 473 + (i % 5 == 0 ? 854 : 0);
|
||||
size_t size = 565 + (i % 5 == 0 ? 854 : 0);
|
||||
#if USE_MALLOC
|
||||
myptrs[i] = malloc(size);
|
||||
#else
|
||||
|
||||
Reference in New Issue
Block a user