// vim:fileencoding=utf-8:foldmethod=marker

#include "../../../common/aliases/aliases.h"
#include "../../../common/platform/platform.h"

#ifdef WAPP_PLATFORM_POSIX

#include "mem_os_posix.h"
#include "../mem_os_ops.h"
#include <sys/mman.h>

wapp_intern const i32 access_types[] = {
    [WAPP_MEM_ACCESS_NONE]            = PROT_NONE,
    [WAPP_MEM_ACCESS_READ_ONLY]       = PROT_READ,
    [WAPP_MEM_ACCESS_EXEC_ONLY]       = PROT_EXEC,
    [WAPP_MEM_ACCESS_READ_WRITE]      = PROT_READ | PROT_WRITE,
    [WAPP_MEM_ACCESS_READ_EXEC]       = PROT_READ | PROT_EXEC,
    [WAPP_MEM_ACCESS_READ_WRITE_EXEC] = PROT_READ | PROT_WRITE | PROT_EXEC,
};

void *mem_util_allocate(void *addr, u64 size, MemAccess access, MemAllocFlags flags, MemInitType type) {
  (void)type;
  i32 alloc_flags = flags | MAP_ANON | MAP_PRIVATE;

#if defined(WAPP_PLATFORM_LINUX) || defined(WAPP_PLATFORM_GNU) || defined(WAPP_PLATFORM_NET_BSD)
  alloc_flags |= MAP_NORESERVE;
#endif

  return mmap(addr, size, access_types[access], alloc_flags, -1, 0);
}

void mem_util_free(void *ptr, u64 size) {
  munmap(ptr, size);
}

#endif // !WAPP_PLATFORM_POSIX
