From 99976d6c2be110ec3d9a2ce905e8545d6c249af9 Mon Sep 17 00:00:00 2001 From: Daan Date: Tue, 17 Jun 2025 19:34:32 -0700 Subject: [PATCH] fix merge error where commit bits in the pagemap were not set --- include/mimalloc/internal.h | 2 +- src/page-map.c | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/include/mimalloc/internal.h b/include/mimalloc/internal.h index ce666162..fd6c8d5d 100644 --- a/include/mimalloc/internal.h +++ b/include/mimalloc/internal.h @@ -613,7 +613,7 @@ static inline size_t _mi_page_map_index(const void* p, size_t* sub_idx) { return (u / MI_PAGE_MAP_SUB_COUNT); } -static inline mi_page_t** _mi_page_map_at(size_t idx) { +static inline mi_submap_t _mi_page_map_at(size_t idx) { return mi_atomic_load_ptr_relaxed(mi_page_t*, &_mi_page_map[idx]); } diff --git a/src/page-map.c b/src/page-map.c index d7b99a75..08ded252 100644 --- a/src/page-map.c +++ b/src/page-map.c @@ -224,8 +224,9 @@ static bool mi_page_map_ensure_committed(size_t idx, mi_submap_t* submap) { mi_page_map_cannot_commit(); return false; } + mi_atomic_or_acq_rel(&mi_page_map_commit, MI_ZU(1) << bit_idx); } - *submap = _mi_page_map[idx]; + *submap = mi_atomic_load_ptr_acquire(mi_page_t*, &_mi_page_map[idx]); // acquire _mi_page_map_at(idx); return true; } @@ -295,7 +296,7 @@ void _mi_page_map_unsafe_destroy(mi_subproc_t* subproc) { for (size_t idx = 1; idx < mi_page_map_count; idx++) { // skip entry 0 (as we allocate that submap at the end of the page_map) // free all sub-maps if (mi_page_map_is_committed(idx, NULL)) { - mi_page_t** sub = _mi_page_map_at(idx); + mi_submap_t sub = _mi_page_map_at(idx); if (sub != NULL) { mi_memid_t memid = _mi_memid_create_os(sub, MI_PAGE_MAP_SUB_SIZE, true, false, false); _mi_os_free_ex(memid.mem.os.base, memid.mem.os.size, true, memid, subproc);