diff options
Diffstat (limited to 'mmalloc.hpp')
-rw-r--r-- | mmalloc.hpp | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/mmalloc.hpp b/mmalloc.hpp new file mode 100644 index 0000000..a794a34 --- /dev/null +++ b/mmalloc.hpp @@ -0,0 +1,52 @@ +#pragma once + +#include <initializer_list> +#include <stdio.h> +#include <sys/mman.h> +#include <unistd.h> + +void *malloc_hugetlbfs(size_t size) { +void *r; + char tmpName[] = "/mnt/hugetlbfs/mmallocXXXXXX"; + int fd = mkstemp(tmpName); + if (fd < 0) goto fail1; + + if (ftruncate(fd, size) != 0) goto fail2; + + r = mmap(NULL, + size, + PROT_READ | PROT_WRITE, + MAP_SHARED | MAP_POPULATE, + fd, 0); + if (r == MAP_FAILED) goto fail2; + + return r; + + fail2: + close(fd); + fail1: + perror(NULL); + return MAP_FAILED; +} + +void *malloc_mmap(size_t size) { + void *r; + for (auto flag : {MAP_POPULATE | MAP_HUGETLB, MAP_POPULATE, 0}) { + fprintf(stderr, "try %i", flag); + r = mmap(NULL, size, + PROT_READ | PROT_WRITE, + flag | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + if (r != MAP_FAILED) break; + perror("mmap"); + } + return r; +} + +template<typename T> +T* mmalloc() { + void *r; + if ((r = malloc_hugetlbfs(sizeof(T))) == MAP_FAILED) + if ((r = malloc_mmap(sizeof(T))) == MAP_FAILED) + exit(EXIT_FAILURE); + return (T*) r; +} |