Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
b5fdee4
fix mingw detection: __GCC__ -> __GNUC__ (see also PR #1349)
daanx Aug 2, 2026
11e6853
fix error condition in XMALLOC, PR #1353 by @mdionisio
daanx Aug 3, 2026
b7ee6b6
make build deterministic, issue #1355
daanx Aug 3, 2026
6724c03
use direct WriteFile or console output on Windows, issue #1354
daanx Aug 3, 2026
97e198c
ensure the full usable block size is zerod on reallocation, issue #763
daanx Aug 3, 2026
11d655a
ensure the full usable block size is zero'd on reallocation, issue #763
daanx Aug 3, 2026
43e66ab
Merge branch 'dev' into dev2
daanx Aug 3, 2026
591e889
ensure the full usable block size is zero'd on reallocation, issue #763
daanx Aug 3, 2026
9e27e1c
improve rezalloc and rezalloc aligned, issue #763
daanx Aug 3, 2026
8c12d0e
merge from dev
daanx Aug 3, 2026
36f2efe
fix signature of mem_is_zero
daanx Aug 3, 2026
3b798c2
fix signature of mem_is_zero
daanx Aug 3, 2026
8810b23
add AIX support, issue #764
daanx Aug 3, 2026
3a1e62b
Merge branch 'dev' into dev2
daanx Aug 3, 2026
55f12a9
set usable parameter in guarded allocation
daanx Aug 4, 2026
86b4bb9
refine useable size in mi_heap_realloc_zero
daanx Aug 4, 2026
7413a8b
for realloc, use mi_usable_size if padding is enabled
daanx Aug 4, 2026
65dd388
fix usable return value for guarded allocations
daanx Aug 4, 2026
6d545f7
fix heap_realloc with guarded pages
daanx Aug 4, 2026
c9b0b8d
return block_size from the umalloc api's (instead of usable)
daanx Aug 4, 2026
427df0b
improve umalloc and realloc efficiency
daanx Aug 4, 2026
c587c3f
Merge branch 'dev' into dev2
daanx Aug 4, 2026
e721902
compile without errors on mingw with ucrt64
daanx Aug 4, 2026
32943b8
add minject step for dynamic redirect tests on mingw
daanx Aug 4, 2026
44d473d
Merge branch 'dev' into dev2
daanx Aug 4, 2026
1cf8869
use __MINGW32__ to detect mingw (instead of __GNUC__) -- use default …
daanx Aug 4, 2026
e085876
add mingw UCRT64 detection (see also PR #1349)
daanx Aug 4, 2026
e68ba5a
fix msystem ucrt64 detection
daanx Aug 4, 2026
6614106
add msys2 mingw ucrt64 test
daanx Aug 4, 2026
d6c1135
bump version to v1.9.15
daanx Aug 5, 2026
8d4c1de
merge from dev, bump version to v2.4.5
daanx Aug 5, 2026
6c84ab6
update readme
daanx Aug 5, 2026
cde3f7a
Merge branch 'dev' into dev2
daanx Aug 5, 2026
d82a513
merge from dev2 for new release
daanx Aug 5, 2026
e6d8e90
update readme
daanx Aug 5, 2026
a7f417f
Merge branch 'dev' into dev2
daanx Aug 5, 2026
f8a8edc
Merge branch 'dev2' into dev-main
daanx Aug 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/release.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ permissions:
contents: write

env:
RELEASE: Release v3.4.4
RELEASE: Release v3.4.5
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true

name: Release
Expand All @@ -19,7 +19,7 @@ jobs:
runs-on: ${{ matrix.os }}
strategy:
matrix:
branch: [v3.4.4, v2.4.4, v1.9.14] # [dev,dev2,dev3]
branch: [v3.4.5, v2.4.5, v1.9.15] # [dev,dev2,dev3]
# we build on the oldest ubuntu version for better binary compatibility.
os: [windows-latest, macOS-latest, macos-15-intel, ubuntu-22.04, ubuntu-22.04-arm]

Expand Down
33 changes: 33 additions & 0 deletions .github/workflows/test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@ jobs:
exclude:
- os: macos-14
tests: extra
include:
- os: windows-latest
tests: mingw-ucrt64

steps:
# Checkout: https://github.com/actions/checkout
Expand Down Expand Up @@ -161,3 +164,33 @@ jobs:
ctest --test-dir out/release-guarded --verbose --timeout 240 -C Release
env:
MIMALLOC_GUARDED_SAMPLE_RATE: 100

# MSYS2 mingw64 UCRT64
- name: mingw-ucrt64 x64, Setup
if: matrix.tests == 'mingw-ucrt64'
uses: msys2/setup-msys2@v2
with:
msystem: UCRT64
install: |
mingw-w64-ucrt-x86_64-gcc
mingw-w64-ucrt-x86_64-git
mingw-w64-ucrt-x86_64-make
mingw-w64-ucrt-x86_64-cmake

- name: mingw-ucrt64 x64, Debug
if: matrix.tests == 'mingw-ucrt64'
shell: msys2 {0}
run: |
env
cmake . -B out/debug-mingw-ucrt64-x64 -DCMAKE_BUILD_TYPE=Debug -DMI_DEBUG_FULL=ON
cmake --build out/debug-mingw-ucrt64-x64 --parallel 4 --config Debug
ctest --test-dir out/debug-mingw-ucrt64-x64 --verbose --timeout 240 -C Debug

- name: mingw-ucrt64 x64, Release
if: matrix.tests == 'mingw-ucrt64'
shell: msys2 {0}
run: |
cmake . -B out/release-mingw-ucrt64-x64 -DCMAKE_BUILD_TYPE=Release -DMI_OPT_ARCH=ON
cmake --build out/release-mingw-ucrt64-x64 --parallel 4 --config Release
ctest --test-dir out/release-mingw-ucrt64-x64 --verbose --timeout 240 -C Release

21 changes: 21 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -406,6 +406,12 @@ if(MI_LIBC_MUSL)
list(APPEND mi_defines MI_LIBC_MUSL=1)
endif()

if("$ENV{MSYSTEM}" STREQUAL "UCRT64")
message(STATUS "Detected MSYS2 UCRT64 environment")
set(MI_MINGW_UCRT64 "ON")
list(APPEND mi_defines MI_WINGW_UCRT64=1)
endif()

if(MI_WIN_USE_FIXED_TLS)
message(STATUS "Use fixed TLS slot on Windows to avoid extra tests in the malloc fast path (MI_WIN_USE_FIXED_TLS=ON)")
list(APPEND mi_defines MI_WIN_USE_FIXED_TLS=1)
Expand Down Expand Up @@ -580,6 +586,12 @@ if(CMAKE_BUILD_TYPE_LC MATCHES "^(release|relwithdebinfo|minsizerel|none)$")
else()
set(mi_libname "${mi_libname}-${CMAKE_BUILD_TYPE_LC}") #append build type (e.g. -debug) if not a release version
endif()
string(REGEX REPLACE "^mimalloc[-]?" "" mi_libsuffix "${mi_libname}")

set(mi_libname "mimalloc")
if(NOT mi_libsuffix STREQUAL "")
set(mi_libname "${mi_libname}-${mi_libsuffix}")
endif()

if(MI_BUILD_SHARED)
list(APPEND mi_build_targets "shared")
Expand Down Expand Up @@ -643,16 +655,20 @@ if(MI_BUILD_SHARED)
# On windows, link and copy the mimalloc redirection dll too.
if(CMAKE_GENERATOR_PLATFORM STREQUAL "arm64ec")
set(MIMALLOC_REDIRECT_SUFFIX "-arm64ec")
set(MINJECT_SUFFIX "")
elseif(MI_ARCH STREQUAL "x64")
set(MIMALLOC_REDIRECT_SUFFIX "")
set(MINJECT_SUFFIX "")
if(CMAKE_SYSTEM_PROCESSOR STREQUAL "ARM64")
message(STATUS "Note: x64 code emulated on Windows for arm64 should use an arm64ec build of 'mimalloc.dll'")
message(STATUS " together with 'mimalloc-redirect-arm64ec.dll'. See the 'bin\\readme.md' for more information.")
endif()
elseif(MI_ARCH STREQUAL "x86")
set(MIMALLOC_REDIRECT_SUFFIX "32")
set(MINJECT_SUFFIX "32")
else()
set(MIMALLOC_REDIRECT_SUFFIX "-${MI_ARCH}") # -arm64 etc.
set(MINJECT_SUFFIX "-${MI_ARCH}")
endif()

target_link_libraries(mimalloc PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/bin/mimalloc-redirect${MIMALLOC_REDIRECT_SUFFIX}.lib) # the DLL import library
Expand Down Expand Up @@ -774,6 +790,11 @@ if (MI_BUILD_TESTS)
if(WIN32)
target_compile_definitions(mimalloc-test-stress-dynamic PRIVATE "MI_LINK_VERSION=1") # link mi_version
target_link_libraries(mimalloc-test-stress-dynamic PRIVATE mimalloc ${mi_libraries}) # link mi_version
if(MINGW AND MI_MINGW_UCRT64)
# mingw always links mimalloc after system libraries.
# post-process with `minject` to make sure mimalloc is the first dll in the load order.
add_custom_command(TARGET mimalloc-test-stress-dynamic POST_BUILD COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/bin/minject${MINJECT_SUFFIX} --postfix=${mi_libsuffix} -f -i $<TARGET_FILE:mimalloc-test-stress-dynamic>)
endif()
add_test(NAME test-stress-dynamic COMMAND ${CMAKE_COMMAND} -E env MIMALLOC_VERBOSE=1 $<TARGET_FILE:mimalloc-test-stress-dynamic>)
else()
target_link_libraries(mimalloc-test-stress-dynamic PRIVATE ${mi_libraries}) # pthreads, issue 1158
Expand Down
2 changes: 1 addition & 1 deletion cmake/mimalloc-config-version.cmake
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
set(mi_version_major 2)
set(mi_version_minor 4)
set(mi_version_patch 4)
set(mi_version_patch 5)
set(mi_version ${mi_version_major}.${mi_version_minor})

set(PACKAGE_VERSION ${mi_version})
Expand Down
2 changes: 1 addition & 1 deletion include/mimalloc.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ terms of the MIT license. A copy of the license can be found in the file
#ifndef MIMALLOC_H
#define MIMALLOC_H

#define MI_MALLOC_VERSION 20404 // major + 2 digits minor + 2 digits patch
#define MI_MALLOC_VERSION 20405 // major + 2 digits minor + 2 digits patch

// ------------------------------------------------------
// Compiler specific attributes
Expand Down
55 changes: 33 additions & 22 deletions include/mimalloc/internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,11 @@ terms of the MIT license. A copy of the license can be found in the file
#define mi_decl_align(a) __attribute__((aligned(a)))
#define mi_decl_noreturn __attribute__((noreturn))
#define mi_decl_weak __attribute__((weak))
#if defined(__MINGW32__)
#define mi_decl_hidden
#else
#define mi_decl_hidden __attribute__((visibility("hidden")))
#endif
#if (__GNUC__ >= 4) || defined(__clang__)
#define mi_decl_cold __attribute__((cold))
#else
Expand Down Expand Up @@ -80,6 +84,14 @@ terms of the MIT license. A copy of the license can be found in the file
#define mi_likely(x) (x)
#endif

#if (defined(__GNUC__) && (__GNUC__ >= 7)) || defined(__clang__) // includes clang and icc
#define mi_decl_maybe_unused __attribute__((unused))
#elif __cplusplus >= 201703L // c++17
#define mi_decl_maybe_unused [[maybe_unused]]
#else
#define mi_decl_maybe_unused
#endif

#ifndef __has_builtin
#define __has_builtin(x) 0
#endif
Expand Down Expand Up @@ -239,7 +251,7 @@ bool _mi_segment_attempt_reclaim(mi_heap_t* heap, mi_segment_t* segment);
bool _mi_segment_visit_blocks(mi_segment_t* segment, int heap_tag, bool visit_blocks, mi_block_visit_fun* visitor, void* arg);

// "page.c"
void* _mi_malloc_generic(mi_heap_t* heap, size_t size, bool zero, size_t huge_alignment, size_t* usable) mi_attr_noexcept mi_attr_malloc;
void* _mi_malloc_generic(mi_heap_t* heap, size_t size, bool zero, size_t huge_alignment, mi_page_t** ppage) mi_attr_noexcept mi_attr_malloc;

void _mi_page_retire(mi_page_t* page) mi_attr_noexcept; // free the page if there are no other pages with many free blocks
void _mi_page_unfull(mi_page_t* page);
Expand Down Expand Up @@ -282,17 +294,17 @@ mi_msecs_t _mi_clock_end(mi_msecs_t start);
mi_msecs_t _mi_clock_start(void);

// "alloc.c"
void* _mi_page_malloc_zero(mi_heap_t* heap, mi_page_t* page, size_t size, bool zero, size_t* usable) mi_attr_noexcept; // called from `_mi_malloc_generic`
void* _mi_page_malloc_zero(mi_heap_t* heap, mi_page_t* page, size_t size, bool zero, mi_page_t** ppage) mi_attr_noexcept; // called from `_mi_malloc_generic`
void* _mi_page_malloc(mi_heap_t* heap, mi_page_t* page, size_t size) mi_attr_noexcept; // called from `_mi_heap_malloc_aligned`
void* _mi_page_malloc_zeroed(mi_heap_t* heap, mi_page_t* page, size_t size) mi_attr_noexcept; // called from `_mi_heap_malloc_aligned`
void* _mi_heap_malloc_zero(mi_heap_t* heap, size_t size, bool zero) mi_attr_noexcept;
void* _mi_heap_malloc_zero_ex(mi_heap_t* heap, size_t size, bool zero, size_t huge_alignment, size_t* usable) mi_attr_noexcept; // called from `_mi_heap_malloc_aligned`
void* _mi_heap_realloc_zero(mi_heap_t* heap, void* p, size_t newsize, bool zero, size_t* usable_pre, size_t* usable_post) mi_attr_noexcept;
void* _mi_heap_malloc_zero_ex(mi_heap_t* heap, size_t size, bool zero, size_t huge_alignment, mi_page_t** ppage) mi_attr_noexcept; // called from `_mi_heap_malloc_aligned`
void* _mi_heap_realloc_zero(mi_heap_t* heap, void* p, size_t newsize, bool zero, size_t* pblock_size_pre, size_t* pblock_size_post) mi_attr_noexcept;
mi_block_t* _mi_page_ptr_unalign(const mi_page_t* page, const void* p);
bool _mi_free_delayed_block(mi_block_t* block);
void _mi_free_generic(mi_segment_t* segment, mi_page_t* page, bool is_local, void* p) mi_attr_noexcept; // for runtime integration
void _mi_padding_shrink(const mi_page_t* page, const mi_block_t* block, const size_t min_size);

size_t _mi_page_usable_size(const mi_page_t* page, const void* p) mi_attr_noexcept;
#if MI_DEBUG>1
bool _mi_page_is_valid(mi_page_t* page);
#endif
Expand Down Expand Up @@ -381,7 +393,7 @@ static inline bool _mi_is_power_of_two(uintptr_t x) {

// valid alignment values are as posix memalign: <https://en.cppreference.com/c/memory/aligned_alloc#Notes>
static inline bool mi_alignment_is_valid(size_t alignment) {
return ((alignment!=0) && _mi_is_power_of_two(alignment));
return ((alignment!=0) && _mi_is_power_of_two(alignment));
}

// Is a pointer aligned?
Expand All @@ -392,7 +404,7 @@ static inline bool _mi_is_aligned(void* p, size_t alignment) {
// Align upwards
static inline uintptr_t _mi_align_up(uintptr_t sz, size_t alignment) {
mi_assert_internal(alignment != 0);
uintptr_t mask = alignment - 1;
const uintptr_t mask = alignment - 1;
if ((alignment & mask) == 0) { // power of two?
return ((sz + mask) & ~mask);
}
Expand All @@ -401,29 +413,28 @@ static inline uintptr_t _mi_align_up(uintptr_t sz, size_t alignment) {
}
}

// Align downwards
// Align a pointer upwards
static inline void* _mi_align_up_ptr(const void* p, size_t alignment) {
return (void*)_mi_align_up((uintptr_t)p, alignment);
}

// Align down
static inline uintptr_t _mi_align_down(uintptr_t sz, size_t alignment) {
mi_assert_internal(alignment != 0);
uintptr_t mask = alignment - 1;
if ((alignment & mask) == 0) { // power of two?
const uintptr_t mask = alignment - 1;
if ((alignment & mask) == 0) { // power of two?
return (sz & ~mask);
}
else {
return ((sz / alignment) * alignment);
return ((sz/alignment)*alignment);
}
}

// Align a pointer upwards
static inline void* _mi_align_up_ptr(const void* p, size_t alignment) {
return (void*)_mi_align_up((uintptr_t)p, alignment);
}

// Align a pointer downwards
static inline void* _mi_align_down_ptr(void* p, size_t alignment) {
static inline void* _mi_align_down_ptr(const void* p, size_t alignment) {
return (void*)_mi_align_down((uintptr_t)p, alignment);
}


// Divide upwards: `s <= _mi_divide_up(s,d)*d < s+d`.
static inline uintptr_t _mi_divide_up(uintptr_t size, size_t divider) {
mi_assert_internal(divider != 0);
Expand Down Expand Up @@ -738,15 +749,15 @@ static inline bool mi_heap_malloc_use_guarded(mi_heap_t* heap, size_t size) {
// no sample
heap->guarded_sample_count = count;
return false;
}
else {
}
else {
// count == 0
const size_t rate = heap->guarded_sample_rate;
if (rate == 0) {
return false; // don't write to an empty theap
}
else if (size >= heap->guarded_size_min && size <= heap->guarded_size_max) {
// use guarded allocation
// use guarded allocation
heap->guarded_sample_count = rate; // reset
return true;
}
Expand All @@ -758,7 +769,7 @@ static inline bool mi_heap_malloc_use_guarded(mi_heap_t* heap, size_t size) {
}
}

mi_decl_restrict void* _mi_heap_malloc_guarded(mi_heap_t* heap, size_t size, bool zero, size_t* usable) mi_attr_noexcept;
mi_decl_restrict void* _mi_heap_malloc_guarded(mi_heap_t* heap, size_t size, bool zero, mi_page_t** ppage) mi_attr_noexcept;

#endif

Expand Down
2 changes: 1 addition & 1 deletion include/mimalloc/types.h
Original file line number Diff line number Diff line change
Expand Up @@ -543,7 +543,7 @@ typedef struct mi_random_cxt_s {
#if (MI_PADDING)
typedef struct mi_padding_s {
uint32_t canary; // encoded block value to check validity of the padding (in case of overflow)
uint32_t delta; // padding bytes before the block. (mi_usable_size(p) - delta == exact allocated bytes)
uint32_t delta; // padding bytes before the block. (mi_full_usable_size(p) - delta == exact allocated bytes)
} mi_padding_t;
#define MI_PADDING_SIZE (sizeof(mi_padding_t))
#define MI_PADDING_WSIZE ((MI_PADDING_SIZE + MI_INTPTR_SIZE - 1) / MI_INTPTR_SIZE)
Expand Down
48 changes: 26 additions & 22 deletions readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@ is a general purpose allocator with excellent [performance](#performance) charac
Initially developed by Daan Leijen for the runtime systems of the
[Koka](https://koka-lang.github.io) and [Lean](https://github.com/leanprover/lean) languages.

Latest release : `v3.4.4` (2026-08-01) recommended.
Latest v2 release: `v2.4.4` (2026-08-01) stable.
Latest v1 release: `v1.9.14` (2026-08-01) legacy.
Latest release : `v3.4.5` (2026-08-05) recommended.
Latest v2 release: `v2.4.5` (2026-08-05) stable.
Latest v1 release: `v1.9.15` (2026-08-05) legacy.

mimalloc is a drop-in replacement for `malloc` and can be used in other programs
without code changes, for example, on dynamically linked ELF-based systems (Linux, BSD, etc.) you can use it as:
Expand Down Expand Up @@ -89,6 +89,10 @@ New development is mostly on v3, while v1 and v2 are maintained with security an
__Send PR's against this version if possible.__

### Releases

* 2026-08-05, `v1.9.15`, `v2.4.5`, `v3.4.5`: Fix compilation with xmalloc (#1353), make the build deterministic (#1355),
mi_zalloc_aligned fix (#763), improve support for mingw (ucrt64), fix fputs fallback on windows (#1354), (v3): use proper
lock backoff for first-class heap deletion, improved riscv64 codegen.
* 2026-08-01, `v1.9.14`, `v2.4.4`, `v3.4.4`: various bug and security fixes through Opus 5 LLM audit (issue #1271, by @Zoxc).
(v3): use pthreads by default on macOS (issue #1333, issue #1327), fix glibc 2.44 crash (issue #1341), fix alignment check for realloc_aligned. (v1,v2,v3): Add initial mingw support,
set `errno` on allocation errors, improved double-free checks and size checks in secure mode, enable
Expand Down Expand Up @@ -127,25 +131,6 @@ New development is mostly on v3, while v1 and v2 are maintained with security an
v3 uses faster TLS access on Windows, and has improved performance for `mi_calloc` and aligned allocations.
Fixed rare race condition on older v3, fixed potential buffer overflow in debug statistics, add API for returning
allocated sizes on allocation and free.
* 2025-06-13, `v3.1.5`: Bug fix release where memory was not always correctly committed (issue #1098).
* 2025-06-09, `v1.9.4`, `v2.2.4`, `v3.1.4` (beta) : Some important bug fixes, including a case where OS memory
was not always fully released. Improved v3 performance, build on XBox, fix build on Android, support interpose
for older macOS versions, use MADV_FREE_REUSABLE on macOS, always check commit success, better support for Windows
fixed TLS offset, etc.
* 2025-03-28, `v1.9.3`, `v2.2.3`, `v3.0.3` (beta) : Various small bug and build fixes, including:
fix arm32 pre v7 builds, fix mingw build, get runtime statistics, improve statistic commit counts,
fix execution on non BMI1 x64 systems.
* 2025-03-06, `v1.9.2`, `v2.2.2`, `v3.0.2-beta`: Various small bug and build fixes.
Add `mi_options_print`, `mi_arenas_print`, and the experimental `mi_stat_get` and `mi_stat_get_json`.
Add `mi_thread_set_in_threadpool` and `mi_heap_set_numa_affinity` (v3 only). Add vcpkg portfile.
Upgrade mimalloc-redirect to v1.3.2. `MI_OPT_ARCH` is off by default now but still assumes armv8.1-a on arm64
for fast atomic operations. Add QNX support.
* 2025-01-03, `v1.8.9`, `v2.1.9`, `v3.0.1-alpha`: Interim release. Support Windows arm64. New [guarded](#guarded) build that can place OS
guard pages behind objects to catch buffer overflows as they occur.
Many small fixes: build on Windows arm64, cygwin, riscV, and dragonfly; fix Windows static library initialization to account for
thread local destructors (in Rust/C++); macOS tag change; macOS TLS slot fix; improve stats;
consistent `mimalloc.dll` on Windows (instead of `mimalloc-override.dll`); fix mimalloc-redirect on Win11 H2;
add 0-byte to canary; upstream CPython fixes; reduce .bss size; allow fixed TLS slot on Windows for improved performance.

* [Older release notes](#older-release-notes)

Expand Down Expand Up @@ -930,6 +915,25 @@ provided by the bot. You will only need to do this once across all repos using o

# Older Release Notes

* 2025-06-09, `v1.9.4`, `v2.2.4`, `v3.1.4` (beta) : Some important bug fixes, including a case where OS memory
was not always fully released. Improved v3 performance, build on XBox, fix build on Android, support interpose
for older macOS versions, use MADV_FREE_REUSABLE on macOS, always check commit success, better support for Windows
fixed TLS offset, etc.
* 2025-03-28, `v1.9.3`, `v2.2.3`, `v3.0.3` (beta) : Various small bug and build fixes, including:
fix arm32 pre v7 builds, fix mingw build, get runtime statistics, improve statistic commit counts,
fix execution on non BMI1 x64 systems.
* 2025-03-06, `v1.9.2`, `v2.2.2`, `v3.0.2-beta`: Various small bug and build fixes.
Add `mi_options_print`, `mi_arenas_print`, and the experimental `mi_stat_get` and `mi_stat_get_json`.
Add `mi_thread_set_in_threadpool` and `mi_heap_set_numa_affinity` (v3 only). Add vcpkg portfile.
Upgrade mimalloc-redirect to v1.3.2. `MI_OPT_ARCH` is off by default now but still assumes armv8.1-a on arm64
for fast atomic operations. Add QNX support.
* 2025-01-03, `v1.8.9`, `v2.1.9`, `v3.0.1-alpha`: Interim release. Support Windows arm64. New [guarded](#guarded) build that can place OS
guard pages behind objects to catch buffer overflows as they occur.
Many small fixes: build on Windows arm64, cygwin, riscV, and dragonfly; fix Windows static library initialization to account for
thread local destructors (in Rust/C++); macOS tag change; macOS TLS slot fix; improve stats;
consistent `mimalloc.dll` on Windows (instead of `mimalloc-override.dll`); fix mimalloc-redirect on Win11 H2;
add 0-byte to canary; upstream CPython fixes; reduce .bss size; allow fixed TLS slot on Windows for improved performance.

* 2024-05-21, `v1.8.7`, `v2.1.7`: Fix build issues on less common platforms. Started upstreaming patches
from the CPython [integration](https://github.com/python/cpython/issues/113141#issuecomment-2119255217). Upstream `vcpkg` patches.
* 2024-05-13, `v1.8.6`, `v2.1.6`: Fix build errors on various (older) platforms. Refactored aligned allocation.
Expand Down
Loading