forked from amir/filehasher
LF MPMC queue improvements
Small improvements of the LF MPMC queue Making the LF MPMC queue generic and in a seperate header file
This commit is contained in:
74
arena_base.h
74
arena_base.h
@@ -1,5 +1,4 @@
|
||||
#ifndef BASE_H
|
||||
#define BASE_H
|
||||
#pragma once
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdbool.h>
|
||||
@@ -58,4 +57,73 @@ typedef double f64;
|
||||
#define ASSERT(x) assert(x)
|
||||
#endif
|
||||
|
||||
#endif // Base.h
|
||||
/* ------------------------------------------------------------
|
||||
Some helper functions
|
||||
------------------------------------------------------------ */
|
||||
|
||||
#if defined(_WIN32) || defined(_WIN64)
|
||||
|
||||
#include <Windows.h>
|
||||
|
||||
static u32 plat_get_pagesize(void) {
|
||||
SYSTEM_INFO sysinfo = {0};
|
||||
GetSystemInfo(&sysinfo);
|
||||
|
||||
return sysinfo.dwPageSize;
|
||||
}
|
||||
|
||||
static void *plat_mem_reserve(u64 size) {
|
||||
return VirtualAlloc(NULL, size, MEM_RESERVE, PAGE_READWRITE);
|
||||
}
|
||||
|
||||
static b32 plat_mem_commit(void *ptr, u64 size) {
|
||||
void *ret = VirtualAlloc(ptr, size, MEM_COMMIT, PAGE_READWRITE);
|
||||
return ret != NULL;
|
||||
}
|
||||
|
||||
static b32 plat_mem_decommit(void *ptr, u64 size) {
|
||||
return VirtualFree(ptr, size, MEM_DECOMMIT);
|
||||
}
|
||||
|
||||
static b32 plat_mem_release(void *ptr, u64 size) {
|
||||
return VirtualFree(ptr, size, MEM_RELEASE);
|
||||
}
|
||||
|
||||
#elif defined(__linux__)
|
||||
|
||||
#ifndef _DEFAULT_SOURCE
|
||||
#define _DEFAULT_SOURCE
|
||||
#endif
|
||||
|
||||
#include <sys/mman.h>
|
||||
#include <unistd.h>
|
||||
|
||||
static u32 plat_get_pagesize(void) { return (u32)sysconf(_SC_PAGESIZE); }
|
||||
|
||||
static void *plat_mem_reserve(u64 size) {
|
||||
void *out = mmap(NULL, size, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
|
||||
if (out == MAP_FAILED) {
|
||||
return NULL;
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
static b32 plat_mem_commit(void *ptr, u64 size) {
|
||||
i32 ret = mprotect(ptr, size, PROT_READ | PROT_WRITE);
|
||||
return ret == 0;
|
||||
}
|
||||
|
||||
static b32 plat_mem_decommit(void *ptr, u64 size) {
|
||||
i32 ret = mprotect(ptr, size, PROT_NONE);
|
||||
if (ret != 0)
|
||||
return false;
|
||||
ret = madvise(ptr, size, MADV_DONTNEED);
|
||||
return ret == 0;
|
||||
}
|
||||
|
||||
static b32 plat_mem_release(void *ptr, u64 size) {
|
||||
i32 ret = munmap(ptr, size);
|
||||
return ret == 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user