mirror of
https://github.com/microsoft/mimalloc.git
synced 2024-12-26 21:04:27 +08:00
Merge branch 'dev' into dev-slice
This commit is contained in:
commit
62708b9843
@ -281,7 +281,7 @@ typedef _Atomic(uintptr_t) mi_atomic_once_t;
|
||||
static inline bool mi_atomic_once( mi_atomic_once_t* once ) {
|
||||
if (mi_atomic_load_relaxed(once) != 0) return false; // quick test
|
||||
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
|
||||
}
|
||||
|
||||
// Yield
|
||||
|
@ -518,7 +518,7 @@ Adress sanitizer support is in its initial development -- please report any issu
|
||||
### ETW
|
||||
|
||||
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
|
||||
`src/prim/windows/etw-mimalloc.wprp` profile. In an admin prompt, you can use:
|
||||
|
@ -241,7 +241,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
|
||||
static void mi_add_stderr_output() {
|
||||
static void mi_add_stderr_output(void) {
|
||||
mi_assert_internal(mi_out_default == NULL);
|
||||
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
|
||||
|
2
src/os.c
2
src/os.c
@ -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 (((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_os_mem_free(p, size, commit, stats);
|
||||
if (size >= (SIZE_MAX - alignment)) return NULL; // overflow
|
||||
const size_t over_size = size + alignment;
|
||||
|
||||
|
@ -169,7 +169,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);
|
||||
if (p==MAP_FAILED || !_mi_is_aligned(p,try_alignment)) {
|
||||
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;
|
||||
// fall back to regular mmap
|
||||
|
@ -212,6 +212,11 @@ int main(void) {
|
||||
result = mi_heap_contains_block(heap, p);
|
||||
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") {
|
||||
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
|
||||
// ---------------------------------------------------
|
||||
|
||||
bool test_heap1() {
|
||||
bool test_heap1(void) {
|
||||
mi_heap_t* heap = mi_heap_new();
|
||||
int* p1 = mi_heap_malloc_tp(heap,int);
|
||||
int* p2 = mi_heap_malloc_tp(heap,int);
|
||||
@ -295,7 +300,7 @@ bool test_heap1() {
|
||||
return true;
|
||||
}
|
||||
|
||||
bool test_heap2() {
|
||||
bool test_heap2(void) {
|
||||
mi_heap_t* heap = mi_heap_new();
|
||||
int* p1 = mi_heap_malloc_tp(heap,int);
|
||||
int* p2 = mi_heap_malloc_tp(heap,int);
|
||||
@ -306,7 +311,7 @@ bool test_heap2() {
|
||||
return true;
|
||||
}
|
||||
|
||||
bool test_stl_allocator1() {
|
||||
bool test_stl_allocator1(void) {
|
||||
#ifdef __cplusplus
|
||||
std::vector<int, mi_stl_allocator<int> > vec;
|
||||
vec.push_back(1);
|
||||
@ -319,7 +324,7 @@ bool test_stl_allocator1() {
|
||||
|
||||
struct some_struct { int i; int j; double z; };
|
||||
|
||||
bool test_stl_allocator2() {
|
||||
bool test_stl_allocator2(void) {
|
||||
#ifdef __cplusplus
|
||||
std::vector<some_struct, mi_stl_allocator<some_struct> > vec;
|
||||
vec.push_back(some_struct());
|
||||
|
Loading…
x
Reference in New Issue
Block a user