mirror of
https://github.com/microsoft/mimalloc.git
synced 2025-05-06 15:29:31 +03:00
allow size==0 for mi_prim_free (issue #1041)
This commit is contained in:
parent
fae61ed946
commit
6bfb1c656c
3 changed files with 12 additions and 11 deletions
14
src/os.c
14
src/os.c
|
@ -1,5 +1,5 @@
|
||||||
/* ----------------------------------------------------------------------------
|
/* ----------------------------------------------------------------------------
|
||||||
Copyright (c) 2018-2023, Microsoft Research, Daan Leijen
|
Copyright (c) 2018-2025, Microsoft Research, Daan Leijen
|
||||||
This is free software; you can redistribute it and/or modify it under the
|
This is free software; you can redistribute it and/or modify it under the
|
||||||
terms of the MIT license. A copy of the license can be found in the file
|
terms of the MIT license. A copy of the license can be found in the file
|
||||||
"LICENSE" at the root of this distribution.
|
"LICENSE" at the root of this distribution.
|
||||||
|
@ -167,8 +167,8 @@ static void mi_os_free_huge_os_pages(void* p, size_t size);
|
||||||
|
|
||||||
static void mi_os_prim_free(void* addr, size_t size, size_t commit_size) {
|
static void mi_os_prim_free(void* addr, size_t size, size_t commit_size) {
|
||||||
mi_assert_internal((size % _mi_os_page_size()) == 0);
|
mi_assert_internal((size % _mi_os_page_size()) == 0);
|
||||||
if (addr == NULL || size == 0) return; // || _mi_os_is_huge_reserved(addr)
|
if (addr == NULL) return; // || _mi_os_is_huge_reserved(addr)
|
||||||
int err = _mi_prim_free(addr, size);
|
int err = _mi_prim_free(addr, size); // allow size==0 (issue #1041)
|
||||||
if (err != 0) {
|
if (err != 0) {
|
||||||
_mi_warning_message("unable to free OS memory (error: %d (0x%x), size: 0x%zx bytes, address: %p)\n", err, err, size, addr);
|
_mi_warning_message("unable to free OS memory (error: %d (0x%x), size: 0x%zx bytes, address: %p)\n", err, err, size, addr);
|
||||||
}
|
}
|
||||||
|
@ -186,10 +186,10 @@ void _mi_os_free_ex(void* addr, size_t size, bool still_committed, mi_memid_t me
|
||||||
void* base = addr;
|
void* base = addr;
|
||||||
// different base? (due to alignment)
|
// different base? (due to alignment)
|
||||||
if (memid.mem.os.base != base) {
|
if (memid.mem.os.base != base) {
|
||||||
mi_assert(memid.mem.os.base <= addr);
|
mi_assert(memid.mem.os.base <= addr);
|
||||||
base = memid.mem.os.base;
|
base = memid.mem.os.base;
|
||||||
const size_t diff = (uint8_t*)addr - (uint8_t*)memid.mem.os.base;
|
const size_t diff = (uint8_t*)addr - (uint8_t*)memid.mem.os.base;
|
||||||
if (memid.mem.os.size==0) {
|
if (memid.mem.os.size==0) {
|
||||||
csize += diff;
|
csize += diff;
|
||||||
}
|
}
|
||||||
if (still_committed) {
|
if (still_committed) {
|
||||||
|
@ -733,8 +733,8 @@ static int mi_os_numa_node_get(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int _mi_os_numa_node(void) {
|
int _mi_os_numa_node(void) {
|
||||||
if mi_likely(mi_atomic_load_relaxed(&mi_numa_node_count) == 1) {
|
if mi_likely(mi_atomic_load_relaxed(&mi_numa_node_count) == 1) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return mi_os_numa_node_get();
|
return mi_os_numa_node_get();
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* ----------------------------------------------------------------------------
|
/* ----------------------------------------------------------------------------
|
||||||
Copyright (c) 2018-2023, Microsoft Research, Daan Leijen, Alon Zakai
|
Copyright (c) 2018-2025, Microsoft Research, Daan Leijen, Alon Zakai
|
||||||
This is free software; you can redistribute it and/or modify it under the
|
This is free software; you can redistribute it and/or modify it under the
|
||||||
terms of the MIT license. A copy of the license can be found in the file
|
terms of the MIT license. A copy of the license can be found in the file
|
||||||
"LICENSE" at the root of this distribution.
|
"LICENSE" at the root of this distribution.
|
||||||
|
@ -58,7 +58,7 @@ void _mi_prim_mem_init( mi_os_mem_config_t* config) {
|
||||||
extern void emmalloc_free(void*);
|
extern void emmalloc_free(void*);
|
||||||
|
|
||||||
int _mi_prim_free(void* addr, size_t size) {
|
int _mi_prim_free(void* addr, size_t size) {
|
||||||
MI_UNUSED(size);
|
if (size==0) return 0;
|
||||||
emmalloc_free(addr);
|
emmalloc_free(addr);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* ----------------------------------------------------------------------------
|
/* ----------------------------------------------------------------------------
|
||||||
Copyright (c) 2018-2023, Microsoft Research, Daan Leijen
|
Copyright (c) 2018-2025, Microsoft Research, Daan Leijen
|
||||||
This is free software; you can redistribute it and/or modify it under the
|
This is free software; you can redistribute it and/or modify it under the
|
||||||
terms of the MIT license. A copy of the license can be found in the file
|
terms of the MIT license. A copy of the license can be found in the file
|
||||||
"LICENSE" at the root of this distribution.
|
"LICENSE" at the root of this distribution.
|
||||||
|
@ -70,7 +70,7 @@ terms of the MIT license. A copy of the license can be found in the file
|
||||||
#define MADV_FREE POSIX_MADV_FREE
|
#define MADV_FREE POSIX_MADV_FREE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------
|
||||||
// Use syscalls for some primitives to allow for libraries that override open/read/close etc.
|
// Use syscalls for some primitives to allow for libraries that override open/read/close etc.
|
||||||
// and do allocation themselves; using syscalls prevents recursion when mimalloc is
|
// and do allocation themselves; using syscalls prevents recursion when mimalloc is
|
||||||
|
@ -186,6 +186,7 @@ void _mi_prim_mem_init( mi_os_mem_config_t* config )
|
||||||
//---------------------------------------------
|
//---------------------------------------------
|
||||||
|
|
||||||
int _mi_prim_free(void* addr, size_t size ) {
|
int _mi_prim_free(void* addr, size_t size ) {
|
||||||
|
if (size==0) return 0;
|
||||||
bool err = (munmap(addr, size) == -1);
|
bool err = (munmap(addr, size) == -1);
|
||||||
return (err ? errno : 0);
|
return (err ? errno : 0);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue