1#ifndef RVL_SDK_MEM_HEAP_COMMON_H
2#define RVL_SDK_MEM_HEAP_COMMON_H
5#include <revolution/MEM/mem_list.h>
7#include <revolution/OS.h>
15 MEM_HEAP_OPT_CLEAR_ALLOC = (1 << 0),
16 MEM_HEAP_OPT_DEBUG_FILL = (1 << 1),
17 MEM_HEAP_OPT_CAN_LOCK = (1 << 2)
31 u32 attribute_0_24 : 24;
37void MEMiInitHeapHead(
MEMiHeapHead* heap, u32 magic,
void* start,
void* end,
42static uintptr_t GetUIntPtr(
const void* p) {
46static void* AddU32ToPtr(
const void* p, u32 ofs) {
47 return (
void*)(GetUIntPtr(p) + ofs);
50static void* SubU32ToPtr(
const void* p, u32 ofs) {
51 return (
void*)(GetUIntPtr(p) - ofs);
54static const void* AddU32ToCPtr(
const void* p, u32 ofs) {
55 return (
const void*)(GetUIntPtr(p) + ofs);
58static const void* SubU32ToCPtr(
const void* p, u32 ofs) {
59 return (
const void*)(GetUIntPtr(p) - ofs);
62static s32 GetOffsetFromPtr(
const void* start,
const void* end) {
63 return GetUIntPtr(end) - GetUIntPtr(start);
75 if (GetOptForHeap(heap) & MEM_HEAP_OPT_CAN_LOCK) {
76 OSLockMutex(&heap->mutex);
81 if (GetOptForHeap(heap) & MEM_HEAP_OPT_CAN_LOCK) {
82 OSUnlockMutex(&heap->mutex);
86static void FillAllocMemory(
MEMiHeapHead* heap,
void* memBlock, u32 size) {
87 if (GetOptForHeap(heap) & MEM_HEAP_OPT_CLEAR_ALLOC) {
88 memset(memBlock, 0, size);
92static s32 MEMGetHeapTotalSize(
const MEMiHeapHead* heap) {
93 return GetOffsetFromPtr(heap, heap->end);
96static void* MEMGetHeapEndAddress(
const MEMiHeapHead* heap) {