22
22
#include <sys/mman.h>
23
23
#endif
24
24
25
- #if defined(__APPLE__ ) || defined(__FreeBSD__ ) || defined(__OpenBSD__ ) || defined(__sun )
26
- #define MAP_ANONYMOUS MAP_ANON
27
- #endif
28
-
29
-
30
25
struct rbs_allocator {
31
26
uintptr_t heap_ptr ;
32
27
uintptr_t size ;
33
28
};
34
29
30
+ static void * portable_mmap_anon (size_t size ) {
31
+ void * ptr ;
32
+
33
+ #ifdef _WIN32
34
+ ptr = VirtualAlloc (NULL , size , MEM_RESERVE | MEM_COMMIT , PAGE_READWRITE );
35
+ if (ptr == NULL ) return NULL ;
36
+ #elif defined(MAP_ANONYMOUS )
37
+ ptr = mmap (NULL , size , PROT_READ |PROT_WRITE , MAP_PRIVATE |MAP_ANONYMOUS , -1 , 0 );
38
+ #elif defined(MAP_ANON )
39
+ ptr = mmap (NULL , size , PROT_READ |PROT_WRITE , MAP_PRIVATE |MAP_ANON , -1 , 0 );
40
+ #else
41
+ /* Fallback to /dev/zero for systems without anonymous mapping */
42
+ int fd = open ("/dev/zero" , O_RDWR );
43
+ if (fd == -1 ) return MAP_FAILED ;
44
+
45
+ ptr = mmap (NULL , size , PROT_READ |PROT_WRITE , MAP_PRIVATE , fd , 0 );
46
+ close (fd ); /* Can close fd after mapping */
47
+ #endif
48
+
49
+ return ptr ;
50
+ }
51
+
35
52
static size_t get_system_page_size (void ) {
36
53
#ifdef _WIN32
37
54
SYSTEM_INFO si ;
@@ -49,8 +66,7 @@ static void *map_memory(size_t size) {
49
66
LPVOID result = VirtualAlloc (NULL , size , MEM_RESERVE | MEM_COMMIT , PAGE_READWRITE );
50
67
rbs_assert (result != NULL , "VirtualAlloc failed" );
51
68
#else
52
- void * result = mmap (NULL , size , PROT_READ | PROT_WRITE ,
53
- MAP_PRIVATE | MAP_ANONYMOUS , -1 , 0 );
69
+ void * result = portable_mmap_anon (size );
54
70
rbs_assert (result != MAP_FAILED , "mmap failed" );
55
71
#endif
56
72
return result ;
0 commit comments