mirror of
https://github.com/microsoft/mimalloc.git
synced 2025-05-06 15:29:31 +03:00
merge from dev
This commit is contained in:
commit
d0eebedfbf
4 changed files with 50 additions and 14 deletions
|
@ -24,8 +24,9 @@ uses the block start pointer and original size (corresponding to the `mi_track_m
|
||||||
|
|
||||||
#if MI_VALGRIND
|
#if MI_VALGRIND
|
||||||
|
|
||||||
#define MI_TRACK_ENABLED 1
|
#define MI_TRACK_ENABLED 1
|
||||||
#define MI_TRACK_TOOL "valgrind"
|
#define MI_TRACK_HEAP_DESTROY 1 // track free of individual blocks on heap_destroy
|
||||||
|
#define MI_TRACK_TOOL "valgrind"
|
||||||
|
|
||||||
#include <valgrind/valgrind.h>
|
#include <valgrind/valgrind.h>
|
||||||
#include <valgrind/memcheck.h>
|
#include <valgrind/memcheck.h>
|
||||||
|
@ -39,8 +40,9 @@ uses the block start pointer and original size (corresponding to the `mi_track_m
|
||||||
|
|
||||||
#elif MI_ASAN
|
#elif MI_ASAN
|
||||||
|
|
||||||
#define MI_TRACK_ENABLED 1
|
#define MI_TRACK_ENABLED 1
|
||||||
#define MI_TRACK_TOOL "asan"
|
#define MI_TRACK_HEAP_DESTROY 0
|
||||||
|
#define MI_TRACK_TOOL "asan"
|
||||||
|
|
||||||
#include <sanitizer/asan_interface.h>
|
#include <sanitizer/asan_interface.h>
|
||||||
|
|
||||||
|
@ -52,8 +54,9 @@ uses the block start pointer and original size (corresponding to the `mi_track_m
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
#define MI_TRACK_ENABLED 0
|
#define MI_TRACK_ENABLED 0
|
||||||
#define MI_TRACK_TOOL "none"
|
#define MI_TRACK_HEAP_DESTROY 0
|
||||||
|
#define MI_TRACK_TOOL "none"
|
||||||
|
|
||||||
#define mi_track_malloc_size(p,reqsize,size,zero)
|
#define mi_track_malloc_size(p,reqsize,size,zero)
|
||||||
#define mi_track_free_size(p,_size)
|
#define mi_track_free_size(p,_size)
|
||||||
|
|
|
@ -74,17 +74,17 @@ static mi_decl_noinline void* mi_heap_malloc_zero_aligned_at_fallback(mi_heap_t*
|
||||||
mi_assert_internal(mi_usable_size(p) == mi_usable_size(aligned_p)+adjust);
|
mi_assert_internal(mi_usable_size(p) == mi_usable_size(aligned_p)+adjust);
|
||||||
|
|
||||||
// now zero the block if needed
|
// now zero the block if needed
|
||||||
if (zero && alignment > MI_ALIGNMENT_MAX) {
|
if (alignment > MI_ALIGNMENT_MAX) {
|
||||||
const ptrdiff_t diff = (uint8_t*)aligned_p - (uint8_t*)p;
|
// for the tracker, on huge aligned allocations only from the start of the large block is defined
|
||||||
const ptrdiff_t zsize = mi_page_usable_block_size(_mi_ptr_page(p)) - diff - MI_PADDING_SIZE;
|
mi_track_mem_undefined(aligned_p, size);
|
||||||
if (zsize > 0) { _mi_memzero(aligned_p, zsize); }
|
if (zero) {
|
||||||
|
_mi_memzero(aligned_p, mi_usable_size(aligned_p));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if MI_TRACK_ENABLED
|
|
||||||
if (p != aligned_p) {
|
if (p != aligned_p) {
|
||||||
mi_track_align(p,aligned_p,adjust,mi_usable_size(aligned_p));
|
mi_track_align(p,aligned_p,adjust,mi_usable_size(aligned_p));
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
return aligned_p;
|
return aligned_p;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
11
src/heap.c
11
src/heap.c
|
@ -8,6 +8,7 @@ terms of the MIT license. A copy of the license can be found in the file
|
||||||
#include "mimalloc.h"
|
#include "mimalloc.h"
|
||||||
#include "mimalloc-internal.h"
|
#include "mimalloc-internal.h"
|
||||||
#include "mimalloc-atomic.h"
|
#include "mimalloc-atomic.h"
|
||||||
|
#include "mimalloc-track.h"
|
||||||
|
|
||||||
#include <string.h> // memset, memcpy
|
#include <string.h> // memset, memcpy
|
||||||
|
|
||||||
|
@ -330,6 +331,12 @@ void _mi_heap_destroy_pages(mi_heap_t* heap) {
|
||||||
mi_heap_reset_pages(heap);
|
mi_heap_reset_pages(heap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool mi_cdecl mi_heap_track_block_free(const mi_heap_t* heap, const mi_heap_area_t* area, void* block, size_t block_size, void* arg) {
|
||||||
|
MI_UNUSED(heap); MI_UNUSED(area); MI_UNUSED(arg); MI_UNUSED(block_size);
|
||||||
|
mi_track_free_size(block,mi_usable_size(block));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void mi_heap_destroy(mi_heap_t* heap) {
|
void mi_heap_destroy(mi_heap_t* heap) {
|
||||||
mi_assert(heap != NULL);
|
mi_assert(heap != NULL);
|
||||||
mi_assert(mi_heap_is_initialized(heap));
|
mi_assert(mi_heap_is_initialized(heap));
|
||||||
|
@ -341,6 +348,10 @@ void mi_heap_destroy(mi_heap_t* heap) {
|
||||||
mi_heap_delete(heap);
|
mi_heap_delete(heap);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
// track all blocks as freed
|
||||||
|
#if MI_TRACK_HEAP_DESTROY
|
||||||
|
mi_heap_visit_blocks(heap, true, mi_heap_track_block_free, NULL);
|
||||||
|
#endif
|
||||||
// free all pages
|
// free all pages
|
||||||
_mi_heap_destroy_pages(heap);
|
_mi_heap_destroy_pages(heap);
|
||||||
mi_heap_free(heap);
|
mi_heap_free(heap);
|
||||||
|
|
|
@ -5,7 +5,10 @@ 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.
|
||||||
-----------------------------------------------------------------------------*/
|
-----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
/* test file for valgrind support.
|
/* test file for valgrind/asan support.
|
||||||
|
|
||||||
|
VALGRIND:
|
||||||
|
----------
|
||||||
Compile in an "out/debug" folder:
|
Compile in an "out/debug" folder:
|
||||||
|
|
||||||
> cd out/debug
|
> cd out/debug
|
||||||
|
@ -19,6 +22,25 @@ terms of the MIT license. A copy of the license can be found in the file
|
||||||
and test as:
|
and test as:
|
||||||
|
|
||||||
> valgrind ./test-wrong
|
> valgrind ./test-wrong
|
||||||
|
|
||||||
|
|
||||||
|
ASAN
|
||||||
|
----------
|
||||||
|
Compile in an "out/debug" folder:
|
||||||
|
|
||||||
|
> cd out/debug
|
||||||
|
> cmake ../.. -DMI_ASAN=1
|
||||||
|
> make -j8
|
||||||
|
|
||||||
|
and then compile this file as:
|
||||||
|
|
||||||
|
> clang -g -o test-wrong -I../../include ../../test/test-wrong.c libmimalloc-asan-debug.a -lpthread -fsanitize=address -fsanitize-recover=address
|
||||||
|
|
||||||
|
and test as:
|
||||||
|
|
||||||
|
> ASAN_OPTIONS=verbosity=1:halt_on_error=0 ./test-wrong
|
||||||
|
|
||||||
|
|
||||||
*/
|
*/
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
Loading…
Add table
Reference in a new issue