Skip to content

Commit d57c8f9

Browse files
committed
Fix unavailable MAP_ANONYMOUS
Signed-off-by: Alexandre Terrasa <alexandre.terrasa@shopify.com>
1 parent 2e5d41d commit d57c8f9

File tree

1 file changed

+20
-7
lines changed

1 file changed

+20
-7
lines changed

src/util/rbs_allocator.c

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,30 @@
2222
#include <sys/mman.h>
2323
#endif
2424

25-
#if defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__sun)
26-
#define MAP_ANONYMOUS MAP_ANON
27-
#endif
28-
29-
3025
struct rbs_allocator {
3126
uintptr_t heap_ptr;
3227
uintptr_t size;
3328
};
3429

30+
static void* portable_mmap_anon(size_t size) {
31+
void* ptr;
32+
33+
#if defined(MAP_ANONYMOUS)
34+
ptr = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
35+
#elif defined(MAP_ANON)
36+
ptr = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0);
37+
#else
38+
/* Fallback to /dev/zero for systems without anonymous mapping */
39+
int fd = open("/dev/zero", O_RDWR);
40+
if (fd == -1) return MAP_FAILED;
41+
42+
ptr = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0);
43+
close(fd); /* Can close fd after mapping */
44+
#endif
45+
46+
return ptr;
47+
}
48+
3549
static size_t get_system_page_size(void) {
3650
#ifdef _WIN32
3751
SYSTEM_INFO si;
@@ -49,8 +63,7 @@ static void *map_memory(size_t size) {
4963
LPVOID result = VirtualAlloc(NULL, size, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
5064
rbs_assert(result != NULL, "VirtualAlloc failed");
5165
#else
52-
void *result = mmap(NULL, size, PROT_READ | PROT_WRITE,
53-
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
66+
void *result = portable_mmap_anon(size);
5467
rbs_assert(result != MAP_FAILED, "mmap failed");
5568
#endif
5669
return result;

0 commit comments

Comments
 (0)