mirror of https://github.com/zeldaret/mm.git
80 lines
1.6 KiB
C
80 lines
1.6 KiB
C
#include "global.h"
|
|
|
|
void* THA_GetHead(TwoHeadArena* tha) {
|
|
return tha->head;
|
|
}
|
|
|
|
void THA_SetHead(TwoHeadArena* tha, void* start) {
|
|
tha->head = start;
|
|
}
|
|
|
|
void* THA_GetTail(TwoHeadArena* tha) {
|
|
return tha->tail;
|
|
}
|
|
|
|
void* THA_AllocStart(TwoHeadArena* tha, size_t size) {
|
|
void* start = tha->head;
|
|
|
|
tha->head = (u32)tha->head + size;
|
|
return start;
|
|
}
|
|
|
|
void* THA_AllocStart1(TwoHeadArena* tha) {
|
|
return THA_AllocStart(tha, 1);
|
|
}
|
|
|
|
void* THA_AllocEnd(TwoHeadArena* tha, size_t size) {
|
|
u32 mask;
|
|
|
|
if (size >= 0x10) {
|
|
mask = ~0xF;
|
|
} else if (size & 1) {
|
|
mask = -1;
|
|
} else if (size & 2) {
|
|
mask = ~0x1;
|
|
} else if (size & 4) {
|
|
mask = ~0x3;
|
|
} else {
|
|
mask = (size & 8) ? ~0x7 : -1;
|
|
}
|
|
|
|
tha->tail = (((u32)tha->tail & mask) - size) & mask;
|
|
return tha->tail;
|
|
}
|
|
|
|
void* THA_AllocEndAlign16(TwoHeadArena* tha, size_t size) {
|
|
u32 mask = ~0xF;
|
|
|
|
tha->tail = (((u32)tha->tail & mask) - size) & mask;
|
|
return tha->tail;
|
|
}
|
|
|
|
void* THA_AllocEndAlign(TwoHeadArena* tha, size_t size, u32 mask) {
|
|
tha->tail = (((u32)tha->tail & mask) - size) & mask;
|
|
return tha->tail;
|
|
}
|
|
|
|
s32 THA_GetSize(TwoHeadArena* tha) {
|
|
return (u32)tha->tail - (u32)tha->head;
|
|
}
|
|
|
|
u32 THA_IsCrash(TwoHeadArena* tha) {
|
|
return THA_GetSize(tha) < 0;
|
|
}
|
|
|
|
void THA_Init(TwoHeadArena* tha) {
|
|
tha->head = tha->bufp;
|
|
tha->tail = (u32)tha->bufp + tha->size;
|
|
}
|
|
|
|
void THA_Ct(TwoHeadArena* tha, void* ptr, size_t size) {
|
|
bzero(tha, sizeof(TwoHeadArena));
|
|
tha->bufp = ptr;
|
|
tha->size = size;
|
|
THA_Init(tha);
|
|
}
|
|
|
|
void THA_Dt(TwoHeadArena* tha) {
|
|
bzero(tha, sizeof(TwoHeadArena));
|
|
}
|