From 15061be4b2fec43ed8bfaa807fd98624366d04e6 Mon Sep 17 00:00:00 2001 From: daanx Date: Wed, 25 Dec 2024 10:50:49 -0800 Subject: [PATCH] commit page-map within one allocation --- src/page-map.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/page-map.c b/src/page-map.c index db14265b..a917175a 100644 --- a/src/page-map.c +++ b/src/page-map.c @@ -160,6 +160,7 @@ mi_decl_nodiscard mi_decl_export bool mi_is_in_heap_region(const void* p) mi_att #else // A 2-level page map +#define MI_PAGE_MAP_SUB_SIZE (MI_PAGE_MAP_SUB_COUNT * sizeof(mi_page_t*)) mi_decl_cache_align mi_page_t*** _mi_page_map; static void* mi_page_map_max_address; @@ -167,6 +168,7 @@ static mi_memid_t mi_page_map_memid; static _Atomic(mi_bfield_t) mi_page_map_commit; +static mi_page_t** mi_page_map_ensure_committed(size_t idx); static mi_page_t** mi_page_map_ensure_at(size_t idx); static inline void mi_page_map_set_range(mi_page_t* page, size_t idx, size_t sub_idx, size_t slice_count); @@ -200,16 +202,17 @@ bool _mi_page_map_init(void) { } mi_atomic_store_release(&mi_page_map_commit, (commit ? ~MI_ZU(0) : MI_ZU(0))); - // commit the first part so NULL pointers get resolved without an access violation - mi_page_map_ensure_at(0); - - // note: for the NULL range we only commit one OS page - // mi_page_map_set_range(NULL, 0, 0, 1); - _mi_page_map[0] = (mi_page_t**)((uint8_t*)_mi_page_map + page_map_size); + // note: for the NULL range we only commit one OS page (in the map and sub) if (!mi_page_map_memid.initially_committed) { - _mi_os_commit(_mi_page_map[0], os_page_size, NULL); + _mi_os_commit(&_mi_page_map[0], os_page_size, NULL); // commit first part of the map + } + _mi_page_map[0] = (mi_page_t**)((uint8_t*)_mi_page_map + page_map_size); // we reserved 2 subs at the end already + if (!mi_page_map_memid.initially_committed) { + _mi_os_commit(_mi_page_map[0], os_page_size, NULL); // only first OS page + } + if (!mi_page_map_memid.initially_zero) { + _mi_page_map[0][0] = NULL; } - _mi_page_map[0][0] = NULL; mi_assert_internal(_mi_ptr_page(NULL)==NULL); return true;