| 152 | } |
| 153 | |
| 154 | static void * |
| 155 | pages_map_slow(size_t size, size_t alignment, bool *commit) { |
| 156 | size_t alloc_size = size + alignment - os_page; |
| 157 | /* Beware size_t wrap-around. */ |
| 158 | if (alloc_size < size) { |
| 159 | return NULL; |
| 160 | } |
| 161 | |
| 162 | void *ret; |
| 163 | do { |
| 164 | void *pages = os_pages_map(NULL, alloc_size, alignment, commit); |
| 165 | if (pages == NULL) { |
| 166 | return NULL; |
| 167 | } |
| 168 | size_t leadsize = ALIGNMENT_CEILING((uintptr_t)pages, alignment) |
| 169 | - (uintptr_t)pages; |
| 170 | ret = os_pages_trim(pages, alloc_size, leadsize, size, commit); |
| 171 | } while (ret == NULL); |
| 172 | |
| 173 | assert(ret != NULL); |
| 174 | assert(PAGE_ADDR2BASE(ret) == ret); |
| 175 | return ret; |
| 176 | } |
| 177 | |
| 178 | void * |
| 179 | pages_map(void *addr, size_t size, size_t alignment, bool *commit) { |
no test coverage detected