1 #ifndef MD_HEAP_H_INCLUDED 2 #define MD_HEAP_H_INCLUDED 159 void MemInit(
const struct md_heap_t *Heap);
160 void *MemAlloc(
const struct md_heap_t *Heap, uint32_t Size);
161 void MemFree(
const struct md_heap_t *Heap,
void *Ptr);
172 void MemGenericRelocator(
void **ptr,
void *addr);
174 static inline bool MemInHeap(
const struct md_heap_t *Heap,
void *Ptr)
176 return ((uint8_t *) Ptr >= &Heap->
RamBuffer[0])
181 static inline
void MemAutoLockDestructor(struct
md_auto_lock_t *Lock)
183 MemUnlock(Lock->Heap, Lock->Ptr, Lock->Handler);
186 void MemPrintStat(
const struct md_heap_t *Heap);
187 void MemPrint(
const struct md_heap_t *Heap);
188 void MemPrintExt(
const struct md_heap_t *Heap);
190 #define SYSTEM_HEAP(RequestedNumEntries) \ 191 extern uint32_t __HeapBase, __StackLimit; \ 192 static struct md_descriptor_t SystemHeapEntries[RequestedNumEntries]; \ 193 static struct md_state_t SystemHeapState; \ 194 struct md_heap_t SystemHeap; \ 195 static void SystemHeapCtor(void) __attribute__((constructor)); \ 196 static void SystemHeapCtor(void) \ 198 SystemHeap.Entries = SystemHeapEntries; \ 199 SystemHeap.NumEntries = (RequestedNumEntries); \ 200 SystemHeap.RamBuffer = (uint8_t *) &__HeapBase; \ 201 SystemHeap.RamBufferSize = \ 202 (uint32_t) &__StackLimit - (uint32_t) &__HeapBase; \ 203 SystemHeap.State = &SystemHeapState; \ 204 MemInit(&SystemHeap); \ 205 printf("[HEAP] %d bytes (%d entries) in system heap.\n", \ 206 (unsigned) SystemHeap.RamBufferSize, \ 207 (unsigned) SystemHeap.NumEntries); \ 209 struct md_heap_t SystemHeap 212 #define MEM_AUTO_LOCK(TheName, TheHeap, ThePtr) \ 213 struct md_auto_lock_t TheName \ 214 __attribute__((cleanup(MemAutoLockDestructor))) \ 215 = { .Heap = TheHeap, .Ptr = (void **) ThePtr, }; \ 217 bool Ret = MemLock(TheHeap, ThePtr, &TheName.Handler); \
bool(* md_swap_in_cb_t)(const struct md_heap_t *Heap, uint8_t **DataPtr, uint32_t Pos, uint32_t Size)
__attribute__((always_inline)) static inline void swint_enable_indirect_adapter(swint_state_t *state)
struct md_descriptor_t * Entries
const struct md_heap_t * Heap
md_reloc_handler_t Handler
void(* md_reloc_handler_t)(void **Ptr, void *Addr)
md_reloc_handler_t RelocHandler
bool(* md_swap_out_cb_t)(const struct md_heap_t *Heap, uint32_t Pos, const uint8_t **DataPtr, uint32_t Size)
void MemDefragment(const struct md_heap_t *Heap)
struct md_state_t * State