Init new repository
This commit is contained in:
30
src/compiler/unix_arena.c
Normal file
30
src/compiler/unix_arena.c
Normal file
@@ -0,0 +1,30 @@
|
||||
#define LC_V_UNIX_PAGE_SIZE 4096
|
||||
|
||||
LC_FUNCTION LC_VMemory LC_VReserve(size_t size) {
|
||||
LC_VMemory result = {};
|
||||
size_t size_aligned = LC_AlignUp(size, LC_V_UNIX_PAGE_SIZE);
|
||||
result.data = (uint8_t *)mmap(0, size_aligned, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
|
||||
LC_Assertf(result.data, "Failed to reserve memory using mmap!!");
|
||||
if (result.data) {
|
||||
result.reserve = size_aligned;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
LC_FUNCTION bool LC_VCommit(LC_VMemory *m, size_t commit) {
|
||||
uint8_t *pointer = LC_V_AdvanceCommit(m, &commit, LC_V_UNIX_PAGE_SIZE);
|
||||
if (pointer) {
|
||||
int mprotect_result = mprotect(pointer, commit, PROT_READ | PROT_WRITE);
|
||||
LC_Assertf(mprotect_result == 0, "Failed to commit more memory using mmap");
|
||||
if (mprotect_result == 0) {
|
||||
m->commit += commit;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
LC_FUNCTION void LC_VDeallocate(LC_VMemory *m) {
|
||||
int result = munmap(m->data, m->reserve);
|
||||
LC_Assertf(result == 0, "Failed to release virtual memory using munmap");
|
||||
}
|
||||
Reference in New Issue
Block a user