os_linux: implement virtual memory allocator;

This commit is contained in:
bjorn 2021-07-09 18:39:23 -07:00
parent 8ef2b064fd
commit 7984baad65
3 changed files with 23 additions and 1 deletions

View File

@ -80,7 +80,7 @@ endif
## Linux
ifeq ($(PLATFORM),linux)
linux = y
CFLAGS += -D_POSIX_C_SOURCE=200809L
CFLAGS += -D_POSIX_C_SOURCE=200809L -D_DEFAULT_SOURCE
CFLAGS += -DLOVR_GL
LDFLAGS += -lm -lpthread -ldl
LDFLAGS += -Wl,-rpath,\$ORIGIN

View File

@ -145,6 +145,11 @@ double os_get_time(void);
void os_sleep(double seconds);
void os_request_permission(os_permission permission);
void* os_vm_init(size_t size);
bool os_vm_free(void* p, size_t size);
bool os_vm_commit(void* p, size_t size);
bool os_vm_release(void* p, size_t size);
void os_poll_events(void);
void os_on_quit(fn_quit* callback);
void os_on_focus(fn_focus* callback);

View File

@ -4,6 +4,7 @@
#include <unistd.h>
#include <stdlib.h>
#include <pwd.h>
#include <sys/mman.h>
#include "os_glfw.h"
@ -51,6 +52,22 @@ void os_on_permission(fn_permission* callback) {
//
}
void* os_vm_init(size_t size) {
return mmap(NULL, size, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
}
bool os_vm_free(void* p, size_t size) {
return !munmap(p, size);
}
bool os_vm_commit(void* p, size_t size) {
return !mprotect(p, size, PROT_READ | PROT_WRITE);
}
bool os_vm_release(void* p, size_t size) {
return !madvise(p, size, MADV_DONTNEED);
}
size_t os_get_home_directory(char* buffer, size_t size) {
const char* path = getenv("HOME");