MIRROR: javascript for ๐Ÿœ's, a tiny runtime with big ambitions
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

add hint to mmap

+19 -3
+19 -3
include/arena.h
··· 23 23 #define ARENA_GROW_INCREMENT (8ULL * 1024 * 1024) 24 24 #define ANT_CLOSURE_ARENA_MAX (2ULL * 1024 * 1024 * 1024) 25 25 26 + // preferred base for mmap on platforms where the kernel may hand out 27 + // addresses above the 47-bit NaN-boxing ceiling. We pick 0x100000000 28 + // inside the 47-bit range and above the typical text/data segments. 29 + #define ANT_MMAP_HINT ((void *)0x100000000ULL) 30 + 26 31 typedef struct { 27 32 uint8_t *base; 28 33 size_t committed; ··· 65 70 #else 66 71 67 72 static inline void *ant_arena_reserve(size_t max_size) { 68 - void *p = mmap(NULL, max_size, PROT_NONE, MAP_PRIVATE | MAP_ANON, -1, 0); 73 + void *p = mmap(ANT_MMAP_HINT, max_size, PROT_NONE, MAP_PRIVATE | MAP_ANON, -1, 0); 69 74 if (p == MAP_FAILED) return NULL; 75 + if ((uintptr_t)p >> 47) { 76 + munmap(p, max_size); 77 + p = mmap(NULL, max_size, PROT_NONE, MAP_PRIVATE | MAP_ANON, -1, 0); 78 + if (p == MAP_FAILED) return NULL; 79 + } 70 80 return mantissa_chk(p, "mmap"); 71 81 } 72 82 ··· 95 105 } 96 106 97 107 static inline void *ant_os_alloc(size_t size) { 98 - void *p = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0); 99 - return (p == MAP_FAILED) ? NULL : p; 108 + void *p = mmap(ANT_MMAP_HINT, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0); 109 + if (p == MAP_FAILED) return NULL; 110 + if ((uintptr_t)p >> 47) { 111 + munmap(p, size); 112 + p = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0); 113 + if (p == MAP_FAILED) return NULL; 114 + } 115 + return mantissa_chk(p, "mmap"); 100 116 } 101 117 102 118 static inline int ant_arena_decommit(void *base, size_t old_size, size_t new_size) {