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-
3025struct 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+
3549static 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