Merge branch 'dev-reset' into dev-slice-reset

This commit is contained in:
daanx 2023-04-15 17:59:26 -07:00
commit 6f531a61ef
6 changed files with 14 additions and 9 deletions

View File

@ -281,7 +281,7 @@ typedef _Atomic(uintptr_t) mi_atomic_once_t;
static inline bool mi_atomic_once( mi_atomic_once_t* once ) { static inline bool mi_atomic_once( mi_atomic_once_t* once ) {
if (mi_atomic_load_relaxed(once) != 0) return false; // quick test if (mi_atomic_load_relaxed(once) != 0) return false; // quick test
uintptr_t expected = 0; uintptr_t expected = 0;
return mi_atomic_cas_strong_acq_rel(once, &expected, 1); // try to set to 1 return mi_atomic_cas_strong_acq_rel(once, &expected, 1UL); // try to set to 1
} }
typedef _Atomic(uintptr_t) mi_atomic_guard_t; typedef _Atomic(uintptr_t) mi_atomic_guard_t;

View File

@ -518,7 +518,7 @@ Adress sanitizer support is in its initial development -- please report any issu
### ETW ### ETW
Event tracing for Windows ([ETW]) provides a high performance way to capture all allocations though Event tracing for Windows ([ETW]) provides a high performance way to capture all allocations though
mimalloc and analyze them later. To build with ETW support, use the `-DMI_TRACE_ETW=ON` cmake option. mimalloc and analyze them later. To build with ETW support, use the `-DMI_TRACK_ETW=ON` cmake option.
You can then capture an allocation trace using the Windows performance recorder (WPR), using the You can then capture an allocation trace using the Windows performance recorder (WPR), using the
`src/prim/windows/etw-mimalloc.wprp` profile. In an admin prompt, you can use: `src/prim/windows/etw-mimalloc.wprp` profile. In an admin prompt, you can use:

View File

@ -250,7 +250,7 @@ void mi_register_output(mi_output_fun* out, void* arg) mi_attr_noexcept {
} }
// add stderr to the delayed output after the module is loaded // add stderr to the delayed output after the module is loaded
static void mi_add_stderr_output() { static void mi_add_stderr_output(void) {
mi_assert_internal(mi_out_default == NULL); mi_assert_internal(mi_out_default == NULL);
mi_out_buf_flush(&mi_out_stderr, false, NULL); // flush current contents to stderr mi_out_buf_flush(&mi_out_stderr, false, NULL); // flush current contents to stderr
mi_out_default = &mi_out_buf_stderr; // and add stderr to the delayed output mi_out_default = &mi_out_buf_stderr; // and add stderr to the delayed output

View File

@ -206,8 +206,8 @@ static void* mi_os_mem_alloc_aligned(size_t size, size_t alignment, bool commit,
// if not aligned, free it, overallocate, and unmap around it // if not aligned, free it, overallocate, and unmap around it
if (((uintptr_t)p % alignment != 0)) { if (((uintptr_t)p % alignment != 0)) {
mi_os_mem_free(p, size, commit, stats);
_mi_warning_message("unable to allocate aligned OS memory directly, fall back to over-allocation (size: 0x%zx bytes, address: %p, alignment: 0x%zx, commit: %d)\n", size, p, alignment, commit); _mi_warning_message("unable to allocate aligned OS memory directly, fall back to over-allocation (size: 0x%zx bytes, address: %p, alignment: 0x%zx, commit: %d)\n", size, p, alignment, commit);
mi_os_mem_free(p, size, commit, stats);
if (size >= (SIZE_MAX - alignment)) return NULL; // overflow if (size >= (SIZE_MAX - alignment)) return NULL; // overflow
const size_t over_size = size + alignment; const size_t over_size = size + alignment;

View File

@ -170,7 +170,7 @@ static void* unix_mmap_prim(void* addr, size_t size, size_t try_alignment, int p
p = mmap(addr, size, protect_flags, flags | MAP_ALIGNED(n), fd, 0); p = mmap(addr, size, protect_flags, flags | MAP_ALIGNED(n), fd, 0);
if (p==MAP_FAILED || !_mi_is_aligned(p,try_alignment)) { if (p==MAP_FAILED || !_mi_is_aligned(p,try_alignment)) {
int err = errno; int err = errno;
_mi_warning_message("unable to directly request aligned OS memory (error: %d (0x%x), size: 0x%zx bytes, alignment: 0x%zx, hint address: %p)\n", err, err, size, try_alignment, hint); _mi_warning_message("unable to directly request aligned OS memory (error: %d (0x%x), size: 0x%zx bytes, alignment: 0x%zx, hint address: %p)\n", err, err, size, try_alignment, addr);
} }
if (p!=MAP_FAILED) return p; if (p!=MAP_FAILED) return p;
// fall back to regular mmap // fall back to regular mmap

View File

@ -212,6 +212,11 @@ int main(void) {
result = mi_heap_contains_block(heap, p); result = mi_heap_contains_block(heap, p);
mi_heap_destroy(heap); mi_heap_destroy(heap);
} }
CHECK_BODY("mimalloc-aligned12") {
void* p = mi_malloc_aligned(0x100, 0x100);
result = (((uintptr_t)p % 0x100) == 0); // #602
mi_free(p);
}
CHECK_BODY("malloc-aligned-at1") { CHECK_BODY("malloc-aligned-at1") {
void* p = mi_malloc_aligned_at(48,32,0); result = (p != NULL && ((uintptr_t)(p) + 0) % 32 == 0); mi_free(p); void* p = mi_malloc_aligned_at(48,32,0); result = (p != NULL && ((uintptr_t)(p) + 0) % 32 == 0); mi_free(p);
}; };
@ -286,7 +291,7 @@ int main(void) {
// Larger test functions // Larger test functions
// --------------------------------------------------- // ---------------------------------------------------
bool test_heap1() { bool test_heap1(void) {
mi_heap_t* heap = mi_heap_new(); mi_heap_t* heap = mi_heap_new();
int* p1 = mi_heap_malloc_tp(heap,int); int* p1 = mi_heap_malloc_tp(heap,int);
int* p2 = mi_heap_malloc_tp(heap,int); int* p2 = mi_heap_malloc_tp(heap,int);
@ -295,7 +300,7 @@ bool test_heap1() {
return true; return true;
} }
bool test_heap2() { bool test_heap2(void) {
mi_heap_t* heap = mi_heap_new(); mi_heap_t* heap = mi_heap_new();
int* p1 = mi_heap_malloc_tp(heap,int); int* p1 = mi_heap_malloc_tp(heap,int);
int* p2 = mi_heap_malloc_tp(heap,int); int* p2 = mi_heap_malloc_tp(heap,int);
@ -306,7 +311,7 @@ bool test_heap2() {
return true; return true;
} }
bool test_stl_allocator1() { bool test_stl_allocator1(void) {
#ifdef __cplusplus #ifdef __cplusplus
std::vector<int, mi_stl_allocator<int> > vec; std::vector<int, mi_stl_allocator<int> > vec;
vec.push_back(1); vec.push_back(1);
@ -319,7 +324,7 @@ bool test_stl_allocator1() {
struct some_struct { int i; int j; double z; }; struct some_struct { int i; int j; double z; };
bool test_stl_allocator2() { bool test_stl_allocator2(void) {
#ifdef __cplusplus #ifdef __cplusplus
std::vector<some_struct, mi_stl_allocator<some_struct> > vec; std::vector<some_struct, mi_stl_allocator<some_struct> > vec;
vec.push_back(some_struct()); vec.push_back(some_struct());