mirror of
https://github.com/Ninjdai1/pokeemerald.git
synced 2024-11-16 19:47:35 +01:00
comment MemBlock struct and add data field
This commit is contained in:
parent
b116b3cb2e
commit
ccfaadc775
@ -6,11 +6,23 @@ extern u32 gHeapSize;
|
|||||||
#define MALLOC_SYSTEM_ID 0xA3A3
|
#define MALLOC_SYSTEM_ID 0xA3A3
|
||||||
|
|
||||||
struct MemBlock {
|
struct MemBlock {
|
||||||
|
// Whether this block is currently allocated.
|
||||||
bool16 flag;
|
bool16 flag;
|
||||||
|
|
||||||
|
// Magic number used for error checking. Should equal MALLOC_SYSTEM_ID.
|
||||||
u16 magic;
|
u16 magic;
|
||||||
|
|
||||||
|
// Size of the block (not including this header struct).
|
||||||
u32 size;
|
u32 size;
|
||||||
|
|
||||||
|
// Previous block pointer. Equals gHeapStart if this is the first block.
|
||||||
struct MemBlock *prev;
|
struct MemBlock *prev;
|
||||||
|
|
||||||
|
// Next block pointer. Equals gHeapStart if this is the last block.
|
||||||
struct MemBlock *next;
|
struct MemBlock *next;
|
||||||
|
|
||||||
|
// Data in the memory block. (Arrays of length 0 are a GNU extension.)
|
||||||
|
u8 data[0];
|
||||||
};
|
};
|
||||||
|
|
||||||
void PutMemBlockHeader(void *block, struct MemBlock *prev, struct MemBlock *next, u32 size)
|
void PutMemBlockHeader(void *block, struct MemBlock *prev, struct MemBlock *next, u32 size)
|
||||||
@ -55,7 +67,7 @@ void *AllocInternal(struct MemBlock *pos, u32 size)
|
|||||||
foundBlockSize -= sizeof(struct MemBlock);
|
foundBlockSize -= sizeof(struct MemBlock);
|
||||||
foundBlockSize -= size;
|
foundBlockSize -= size;
|
||||||
|
|
||||||
splitBlock = (struct MemBlock *)((u8 *)(&pos[1]) + size);
|
splitBlock = (struct MemBlock *)(pos->data + size);
|
||||||
|
|
||||||
pos->flag = TRUE;
|
pos->flag = TRUE;
|
||||||
pos->size = size;
|
pos->size = size;
|
||||||
@ -67,7 +79,7 @@ void *AllocInternal(struct MemBlock *pos, u32 size)
|
|||||||
if (splitBlock->next != head)
|
if (splitBlock->next != head)
|
||||||
splitBlock->next->prev = splitBlock;
|
splitBlock->next->prev = splitBlock;
|
||||||
|
|
||||||
return &pos[1];
|
return pos->data;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -154,7 +166,7 @@ bool32 CheckMemBlockInternal(void *heapStart, void *pointer)
|
|||||||
if (block->prev != head && block->prev->next != block)
|
if (block->prev != head && block->prev->next != block)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
if (block->next != head && block->next != (struct MemBlock *)((u8 *)(&block[1]) + block->size))
|
if (block->next != head && block->next != (struct MemBlock *)(block->data + block->size))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@ -192,7 +204,7 @@ bool32 CheckHeap()
|
|||||||
struct MemBlock *pos = (struct MemBlock *)gHeapStart;
|
struct MemBlock *pos = (struct MemBlock *)gHeapStart;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
if (!CheckMemBlockInternal(gHeapStart, &pos[1]))
|
if (!CheckMemBlockInternal(gHeapStart, pos->data))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
pos = pos->next;
|
pos = pos->next;
|
||||||
} while (pos != (struct MemBlock *)gHeapStart);
|
} while (pos != (struct MemBlock *)gHeapStart);
|
||||||
|
Loading…
Reference in New Issue
Block a user