mirror of
https://github.com/ToyB-Chan/minimal-heap.git
synced 2026-11-09 07:02:06 +01:00
Compare commits
3 Commits
77630e2c47
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 083cb52f54 | |||
| a632291f07 | |||
| dcd6c58394 |
@@ -2,16 +2,12 @@
|
|||||||
#define __MINIMAL_HEAP_H__
|
#define __MINIMAL_HEAP_H__
|
||||||
|
|
||||||
#define MIHP_VERSION_MAJOR 1
|
#define MIHP_VERSION_MAJOR 1
|
||||||
#define MIHP_VERSION_MINOR 12
|
#define MIHP_VERSION_MINOR 14
|
||||||
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
#ifndef MIHP_IMPLEMENTATION
|
|
||||||
#define MIHP_IMPLEMENTATION 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Defines to be configured by the library user */
|
/* Defines to be configured by the library user */
|
||||||
#ifndef MIHP_ASSERT
|
#ifndef MIHP_ASSERT
|
||||||
#define MIHP_ASSERT(Condition) while(1) { if (Condition) break; *(volatile char*)(0x0) = 0; }
|
#define MIHP_ASSERT(Condition) while(1) { if (Condition) break; *(volatile char*)(0x0) = 0; }
|
||||||
@@ -22,6 +18,10 @@
|
|||||||
#endif
|
#endif
|
||||||
/* */
|
/* */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef uintptr_t MIHP_HeapOpaque;
|
typedef uintptr_t MIHP_HeapOpaque;
|
||||||
|
|
||||||
typedef void*(MIHP_PlatformRequestMemoryFn)(MIHP_HeapOpaque heap, size_t minRequestedSize, size_t* outActualSize);
|
typedef void*(MIHP_PlatformRequestMemoryFn)(MIHP_HeapOpaque heap, size_t minRequestedSize, size_t* outActualSize);
|
||||||
@@ -217,4 +217,8 @@ size_t MIHP_GetMaximalPayloadSize(const MIHP_Heap* heap);
|
|||||||
#include "minimal_heap_implementation.inl"
|
#include "minimal_heap_implementation.inl"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ MIHP_HeapConfig MIHP_MakeDefaultConfigPreset()
|
|||||||
cfg.AllocateFillValue = 0xbe;
|
cfg.AllocateFillValue = 0xbe;
|
||||||
cfg.FreeFillValue = 0xee;
|
cfg.FreeFillValue = 0xee;
|
||||||
|
|
||||||
cfg.HeapValidationMode = MIHP_HVM_MagicNumber;
|
cfg.HeapValidationMode = MIHP_HVM_None;
|
||||||
|
|
||||||
return cfg;
|
return cfg;
|
||||||
}
|
}
|
||||||
@@ -43,6 +43,12 @@ MIHP_HeapError MIHP_InitializeHeap(MIHP_Heap* heap, MIHP_HeapConfig config)
|
|||||||
if (config.PlatformFreeMemoryFn == NULL)
|
if (config.PlatformFreeMemoryFn == NULL)
|
||||||
return MIHP_HE_BadConfig;
|
return MIHP_HE_BadConfig;
|
||||||
|
|
||||||
|
if (config.OnHeapCorruptionDetectedFn == NULL && config.HeapValidationMode != MIHP_HVM_None)
|
||||||
|
return MIHP_HE_BadConfig;
|
||||||
|
|
||||||
|
if (config.MinMemoryAreaSize < MIHP_GetMinimalPayloadSize(heap) * 2)
|
||||||
|
return MIHP_HE_BadConfig;
|
||||||
|
|
||||||
if (config.MaxHeapSize < config.MinMemoryAreaSize)
|
if (config.MaxHeapSize < config.MinMemoryAreaSize)
|
||||||
return MIHP_HE_BadConfig;
|
return MIHP_HE_BadConfig;
|
||||||
|
|
||||||
@@ -260,7 +266,7 @@ MIHP_HeapResult MIHP_Reallocate(MIHP_Heap* heap, void* ptr, size_t newSize)
|
|||||||
segment->Checksum = MIHP_GenerateHeapSegmentChecksum(heap, segment);
|
segment->Checksum = MIHP_GenerateHeapSegmentChecksum(heap, segment);
|
||||||
|
|
||||||
MIHP_UnlockHeap(heap);
|
MIHP_UnlockHeap(heap);
|
||||||
return MIHP_MAKE_RESULT(NULL, MIHP_HE_Success);
|
return MIHP_MAKE_RESULT(ptr, MIHP_HE_Success);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (segment->NextSegment)
|
if (segment->NextSegment)
|
||||||
@@ -399,9 +405,14 @@ MIHP_HeapError MIHP_SetPointerCustomMetadata(MIHP_Heap* heap, void* ptr, MIHP_Al
|
|||||||
if (!MIHP_IsAddressInHeap(heap, ptr))
|
if (!MIHP_IsAddressInHeap(heap, ptr))
|
||||||
return MIHP_HE_InvalidHeap;
|
return MIHP_HE_InvalidHeap;
|
||||||
|
|
||||||
|
MIHP_LockHeap(heap);
|
||||||
|
|
||||||
MIHP_HeapSegmentHeader* segment = MIHP_GetHeapSegmentHeaderPtr(heap, ptr);
|
MIHP_HeapSegmentHeader* segment = MIHP_GetHeapSegmentHeaderPtr(heap, ptr);
|
||||||
MIHP_ValidateHeapSegmentHeader(heap, segment);
|
MIHP_ValidateHeapSegmentHeader(heap, segment);
|
||||||
segment->CustomMetadata = metadata;
|
segment->CustomMetadata = metadata;
|
||||||
|
segment->Checksum = MIHP_GenerateHeapSegmentChecksum(heap, segment);
|
||||||
|
|
||||||
|
MIHP_UnlockHeap(heap);
|
||||||
return MIHP_HE_Success;
|
return MIHP_HE_Success;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -413,14 +424,22 @@ MIHP_HeapError MIHP_GetPointerCustomMetadata(MIHP_Heap* heap, void* ptr, MIHP_Al
|
|||||||
if (!MIHP_IsAddressInHeap(heap, ptr))
|
if (!MIHP_IsAddressInHeap(heap, ptr))
|
||||||
return MIHP_HE_InvalidHeap;
|
return MIHP_HE_InvalidHeap;
|
||||||
|
|
||||||
|
MIHP_LockHeap(heap);
|
||||||
|
|
||||||
MIHP_HeapSegmentHeader* segment = MIHP_GetHeapSegmentHeaderPtr(heap, ptr);
|
MIHP_HeapSegmentHeader* segment = MIHP_GetHeapSegmentHeaderPtr(heap, ptr);
|
||||||
MIHP_ValidateHeapSegmentHeader(heap, segment);
|
MIHP_ValidateHeapSegmentHeader(heap, segment);
|
||||||
*outMetadata = segment->CustomMetadata;
|
*outMetadata = segment->CustomMetadata;
|
||||||
|
|
||||||
|
MIHP_UnlockHeap(heap);
|
||||||
|
|
||||||
return MIHP_HE_Success;
|
return MIHP_HE_Success;
|
||||||
}
|
}
|
||||||
|
|
||||||
MIHP_HeapError MIHP_MergeHeaps(MIHP_Heap* sourceHeap, MIHP_Heap* heapToAbsorb)
|
MIHP_HeapError MIHP_MergeHeaps(MIHP_Heap* sourceHeap, MIHP_Heap* heapToAbsorb)
|
||||||
{
|
{
|
||||||
|
if (sourceHeap == heapToAbsorb)
|
||||||
|
return MIHP_HE_InvalidParameter;
|
||||||
|
|
||||||
if (!MIHP_IsHeapInitialized(sourceHeap))
|
if (!MIHP_IsHeapInitialized(sourceHeap))
|
||||||
return MIHP_HE_InvalidHeap;
|
return MIHP_HE_InvalidHeap;
|
||||||
|
|
||||||
@@ -493,7 +512,7 @@ bool MIHP_IsAddressInHeap(MIHP_Heap* heap, void* ptr)
|
|||||||
uintptr_t ptrMin = (uintptr_t)currentArea;
|
uintptr_t ptrMin = (uintptr_t)currentArea;
|
||||||
uintptr_t ptrMax = (uintptr_t)currentArea + currentArea->AreaSize;
|
uintptr_t ptrMax = (uintptr_t)currentArea + currentArea->AreaSize;
|
||||||
|
|
||||||
if (searchingPtr >= ptrMin && searchingPtr <= ptrMax)
|
if (searchingPtr >= ptrMin && searchingPtr < ptrMax)
|
||||||
{
|
{
|
||||||
MIHP_UnlockHeap(heap);
|
MIHP_UnlockHeap(heap);
|
||||||
return true;
|
return true;
|
||||||
@@ -561,6 +580,8 @@ MIHP_HeapError MIHP_WalkHeap(MIHP_Heap* heap, MIHP_WalkHeapCallbackFn* callback)
|
|||||||
if (callback == NULL)
|
if (callback == NULL)
|
||||||
return MIHP_HE_InvalidParameter;
|
return MIHP_HE_InvalidParameter;
|
||||||
|
|
||||||
|
MIHP_LockHeap(heap);
|
||||||
|
|
||||||
MIHP_HeapMemoryAreaHeader* nextArea = heap->FirstArea;
|
MIHP_HeapMemoryAreaHeader* nextArea = heap->FirstArea;
|
||||||
while (nextArea != NULL)
|
while (nextArea != NULL)
|
||||||
{
|
{
|
||||||
@@ -579,6 +600,8 @@ MIHP_HeapError MIHP_WalkHeap(MIHP_Heap* heap, MIHP_WalkHeapCallbackFn* callback)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MIHP_UnlockHeap(heap);
|
||||||
|
|
||||||
return MIHP_HE_Success;
|
return MIHP_HE_Success;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -829,9 +852,6 @@ uint32_t MIHP_GenerateHeapSegmentChecksum(const MIHP_Heap* heap, const MIHP_Heap
|
|||||||
|
|
||||||
void MIHP_ValidateHeapMemoryAreaHeader(const MIHP_Heap* heap, const MIHP_HeapMemoryAreaHeader* area)
|
void MIHP_ValidateHeapMemoryAreaHeader(const MIHP_Heap* heap, const MIHP_HeapMemoryAreaHeader* area)
|
||||||
{
|
{
|
||||||
if (heap->Config.OnHeapCorruptionDetectedFn == NULL)
|
|
||||||
return;
|
|
||||||
|
|
||||||
uint32_t newChecksum;
|
uint32_t newChecksum;
|
||||||
|
|
||||||
if (heap->Config.HeapValidationMode == MIHP_HVM_None)
|
if (heap->Config.HeapValidationMode == MIHP_HVM_None)
|
||||||
@@ -858,9 +878,6 @@ void MIHP_ValidateHeapMemoryAreaHeader(const MIHP_Heap* heap, const MIHP_HeapMem
|
|||||||
|
|
||||||
void MIHP_ValidateHeapSegmentHeader(const MIHP_Heap* heap, const MIHP_HeapSegmentHeader* segment)
|
void MIHP_ValidateHeapSegmentHeader(const MIHP_Heap* heap, const MIHP_HeapSegmentHeader* segment)
|
||||||
{
|
{
|
||||||
if (heap->Config.OnHeapCorruptionDetectedFn == NULL)
|
|
||||||
return;
|
|
||||||
|
|
||||||
uint32_t newChecksum;
|
uint32_t newChecksum;
|
||||||
|
|
||||||
if (heap->Config.HeapValidationMode == MIHP_HVM_None)
|
if (heap->Config.HeapValidationMode == MIHP_HVM_None)
|
||||||
|
|||||||
Reference in New Issue
Block a user