From a7370dcbd21f0497bbeb666f22f2e653001ab4c4 Mon Sep 17 00:00:00 2001 From: daanx Date: Wed, 22 Jan 2025 12:25:02 -0800 Subject: [PATCH] fix highest allocated page for arena unload --- src/arena.c | 9 +++++++-- test/main-override-dep.cpp | 10 ++++++++++ test/main-override-dep.h | 1 + test/main-override.cpp | 10 ++++++---- 4 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/arena.c b/src/arena.c index bcde865e..4ad4bb0e 100644 --- a/src/arena.c +++ b/src/arena.c @@ -1834,8 +1834,13 @@ mi_decl_export bool mi_arena_unload(mi_arena_id_t arena_id, void** base, size_t* size_t asize; // scan the commit map for the highest entry size_t idx; - if (mi_bitmap_bsr(arena->slices_committed, &idx)) { - asize = (idx + 1)* MI_ARENA_SLICE_SIZE; + //if (mi_bitmap_bsr(arena->slices_committed, &idx)) { + // asize = (idx + 1)* MI_ARENA_SLICE_SIZE; + //} + if (mi_bitmap_bsr(arena->pages, &idx)) { + mi_page_t* page = (mi_page_t*)mi_arena_slice_start(arena, idx); + const size_t page_slice_count = page->memid.mem.arena.slice_count; + asize = mi_size_of_slices(idx + page_slice_count); } else { asize = mi_arena_info_slices(arena) * MI_ARENA_SLICE_SIZE; diff --git a/test/main-override-dep.cpp b/test/main-override-dep.cpp index e92f6fc4..edb57f1f 100644 --- a/test/main-override-dep.cpp +++ b/test/main-override-dep.cpp @@ -12,4 +12,14 @@ std::string TestAllocInDll::GetString() std::string r = test; delete[] test; return r; +} + +#include + +void TestAllocInDll::TestHeapAlloc() +{ + HANDLE heap = GetProcessHeap(); + int* p = (int*)HeapAlloc(heap, 0, sizeof(int)); + *p = 42; + HeapFree(heap, 0, p); } \ No newline at end of file diff --git a/test/main-override-dep.h b/test/main-override-dep.h index 4826f25f..9d4aabfd 100644 --- a/test/main-override-dep.h +++ b/test/main-override-dep.h @@ -8,4 +8,5 @@ class TestAllocInDll { public: __declspec(dllexport) std::string GetString(); + __declspec(dllexport) void TestHeapAlloc(); }; diff --git a/test/main-override.cpp b/test/main-override.cpp index db594acc..af385992 100644 --- a/test/main-override.cpp +++ b/test/main-override.cpp @@ -37,7 +37,7 @@ static void test_thread_local(); // issue #944 static void test_mixed1(); // issue #942 static void test_stl_allocators(); -#if x_WIN32 +#if _WIN32 #include "main-override-dep.h" static void test_dep(); // issue #981: test overriding in another DLL #else @@ -46,8 +46,8 @@ static void test_dep() { }; int main() { mi_stats_reset(); // ignore earlier allocations - various_tests(); - test_mixed1(); + //various_tests(); + //test_mixed1(); test_dep(); @@ -145,11 +145,13 @@ static bool test_stl_allocator1() { struct some_struct { int i; int j; double z; }; -#if x_WIN32 +#if _WIN32 static void test_dep() { TestAllocInDll t; std::string s = t.GetString(); + + t.TestHeapAlloc(); } #endif