ciabatta/src/cia-mem/allocator.c

69 lines
2.0 KiB
C

static void *_null_allocator_proc(void *ctx, int optype, void *old_ptr, u64 old_size, u64 size, u64 alignment) {
return NULL;
}
Cia_Allocator cia_allocator_null() {
Cia_Allocator allocator = {
.ctx = NULL,
.proc = _null_allocator_proc,
};
return allocator;
}
static void *_page_allocator_proc(void *ctx, int optype, void *old_ptr, u64 old_size, u64 size, u64 alignment) {
switch(optype) {
case CIA_MEM_OP_ALLOC: {
void *addr;
if(alignment > 0x1000) {
return NULL;
}
_RT_Status status = _rt_mem_alloc(NULL, size, &addr);
if(status != _RT_STATUS_OK) {
return NULL;
}
return addr;
} break;
case CIA_MEM_OP_FREE: {
_rt_mem_free(old_ptr, old_size);
} break;
case CIA_MEM_OP_FREE_ALL: {
return NULL;
} break;
case CIA_MEM_OP_RESIZE: {
return NULL;
} break;
}
return NULL;
}
Cia_Allocator cia_allocator_pages() {
Cia_Allocator allocator = {
.ctx = NULL,
.proc = _page_allocator_proc,
};
return allocator;
}
void *cia_allocator_alloc(Cia_Allocator *alloc, u64 size, u64 alignment) {
return alloc->proc(alloc->ctx, CIA_MEM_OP_ALLOC, NULL, 0, size, alignment);
}
void cia_allocator_free_size(Cia_Allocator *alloc, void *region_ptr, u64 region_size) {
alloc->proc(alloc->ctx, CIA_MEM_OP_FREE, region_ptr, region_size, 0, 1);
}
void cia_allocator_free(Cia_Allocator *alloc, void *region_ptr) {
alloc->proc(alloc->ctx, CIA_MEM_OP_FREE, region_ptr, 0, 0, 1);
}
void cia_allocator_free_all(Cia_Allocator *alloc) {
alloc->proc(alloc->ctx, CIA_MEM_OP_FREE_ALL, NULL, 0, 0, 1);
}
void *cia_allocator_resize(Cia_Allocator *alloc, void *old_ptr, u64 old_size, u64 new_size, u64 alignment) {
return alloc->proc(alloc->ctx, CIA_MEM_OP_RESIZE, old_ptr, old_size, new_size, alignment);
}