mirror of
https://github.com/microsoft/mimalloc.git
synced 2025-05-08 00:09:31 +03:00
Merge branch 'dev' of e:\dev\mimalloc3 into dev
This commit is contained in:
commit
83fd6e33fb
6 changed files with 29 additions and 20 deletions
|
@ -276,7 +276,7 @@ mi_decl_export int mi_reserve_huge_os_pages_at(size_t pages, int numa_node, size
|
||||||
mi_decl_export int mi_reserve_os_memory(size_t size, bool commit, bool allow_large) mi_attr_noexcept;
|
mi_decl_export int mi_reserve_os_memory(size_t size, bool commit, bool allow_large) mi_attr_noexcept;
|
||||||
mi_decl_export bool mi_manage_os_memory(void* start, size_t size, bool is_committed, bool is_large, bool is_zero, int numa_node) mi_attr_noexcept;
|
mi_decl_export bool mi_manage_os_memory(void* start, size_t size, bool is_committed, bool is_large, bool is_zero, int numa_node) mi_attr_noexcept;
|
||||||
|
|
||||||
mi_decl_export void mi_debug_show_arenas(bool show_inuse) mi_attr_noexcept;
|
mi_decl_export void mi_debug_show_arenas(void) mi_attr_noexcept;
|
||||||
|
|
||||||
// Experimental: heaps associated with specific memory arena's
|
// Experimental: heaps associated with specific memory arena's
|
||||||
typedef int mi_arena_id_t;
|
typedef int mi_arena_id_t;
|
||||||
|
|
|
@ -64,8 +64,8 @@ terms of the MIT license. A copy of the license can be found in the file
|
||||||
|
|
||||||
// "libc.c"
|
// "libc.c"
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
void _mi_vsnprintf(char* buf, size_t bufsize, const char* fmt, va_list args);
|
int _mi_vsnprintf(char* buf, size_t bufsize, const char* fmt, va_list args);
|
||||||
void _mi_snprintf(char* buf, size_t buflen, const char* fmt, ...);
|
int _mi_snprintf(char* buf, size_t buflen, const char* fmt, ...);
|
||||||
char _mi_toupper(char c);
|
char _mi_toupper(char c);
|
||||||
int _mi_strnicmp(const char* s, const char* t, size_t n);
|
int _mi_strnicmp(const char* s, const char* t, size_t n);
|
||||||
void _mi_strlcpy(char* dest, const char* src, size_t dest_size);
|
void _mi_strlcpy(char* dest, const char* src, size_t dest_size);
|
||||||
|
|
|
@ -923,7 +923,8 @@ static size_t mi_debug_show_bitmap(const char* prefix, const char* header, size_
|
||||||
return inuse_count;
|
return inuse_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
void mi_debug_show_arenas(bool show_inuse) mi_attr_noexcept {
|
void mi_debug_show_arenas(void) mi_attr_noexcept {
|
||||||
|
const bool show_inuse = true;
|
||||||
size_t max_arenas = mi_atomic_load_relaxed(&mi_arena_count);
|
size_t max_arenas = mi_atomic_load_relaxed(&mi_arena_count);
|
||||||
size_t inuse_total = 0;
|
size_t inuse_total = 0;
|
||||||
//size_t abandoned_total = 0;
|
//size_t abandoned_total = 0;
|
||||||
|
|
10
src/libc.c
10
src/libc.c
|
@ -160,8 +160,8 @@ static void mi_out_num(uintmax_t x, size_t base, char prefix, char** out, char*
|
||||||
|
|
||||||
#define MI_NEXTC() c = *in; if (c==0) break; in++;
|
#define MI_NEXTC() c = *in; if (c==0) break; in++;
|
||||||
|
|
||||||
void _mi_vsnprintf(char* buf, size_t bufsize, const char* fmt, va_list args) {
|
int _mi_vsnprintf(char* buf, size_t bufsize, const char* fmt, va_list args) {
|
||||||
if (buf == NULL || bufsize == 0 || fmt == NULL) return;
|
if (buf == NULL || bufsize == 0 || fmt == NULL) return 0;
|
||||||
buf[bufsize - 1] = 0;
|
buf[bufsize - 1] = 0;
|
||||||
char* const end = buf + (bufsize - 1);
|
char* const end = buf + (bufsize - 1);
|
||||||
const char* in = fmt;
|
const char* in = fmt;
|
||||||
|
@ -265,11 +265,13 @@ void _mi_vsnprintf(char* buf, size_t bufsize, const char* fmt, va_list args) {
|
||||||
}
|
}
|
||||||
mi_assert_internal(out <= end);
|
mi_assert_internal(out <= end);
|
||||||
*out = 0;
|
*out = 0;
|
||||||
|
return (int)(out - buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
void _mi_snprintf(char* buf, size_t buflen, const char* fmt, ...) {
|
int _mi_snprintf(char* buf, size_t buflen, const char* fmt, ...) {
|
||||||
va_list args;
|
va_list args;
|
||||||
va_start(args, fmt);
|
va_start(args, fmt);
|
||||||
_mi_vsnprintf(buf, buflen, fmt, args);
|
const int written = _mi_vsnprintf(buf, buflen, fmt, args);
|
||||||
va_end(args);
|
va_end(args);
|
||||||
|
return written;
|
||||||
}
|
}
|
||||||
|
|
12
src/page.c
12
src/page.c
|
@ -990,14 +990,20 @@ void* _mi_malloc_generic(mi_heap_t* heap, size_t size, bool zero, size_t huge_al
|
||||||
mi_assert_internal(mi_page_block_size(page) >= size);
|
mi_assert_internal(mi_page_block_size(page) >= size);
|
||||||
|
|
||||||
// and try again, this time succeeding! (i.e. this should never recurse through _mi_page_malloc)
|
// and try again, this time succeeding! (i.e. this should never recurse through _mi_page_malloc)
|
||||||
|
void* p;
|
||||||
if mi_unlikely(zero && mi_page_is_huge(page)) {
|
if mi_unlikely(zero && mi_page_is_huge(page)) {
|
||||||
// note: we cannot call _mi_page_malloc with zeroing for huge blocks; we zero it afterwards in that case.
|
// note: we cannot call _mi_page_malloc with zeroing for huge blocks; we zero it afterwards in that case.
|
||||||
void* p = _mi_page_malloc(heap, page, size);
|
p = _mi_page_malloc(heap, page, size);
|
||||||
mi_assert_internal(p != NULL);
|
mi_assert_internal(p != NULL);
|
||||||
_mi_memzero_aligned(p, mi_page_usable_block_size(page));
|
_mi_memzero_aligned(p, mi_page_usable_block_size(page));
|
||||||
return p;
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return _mi_page_malloc_zero(heap, page, size, zero);
|
p = _mi_page_malloc_zero(heap, page, size, zero);
|
||||||
|
mi_assert_internal(p != NULL);
|
||||||
}
|
}
|
||||||
|
// move singleton pages to the full queue
|
||||||
|
if (page->reserved == page->used) {
|
||||||
|
mi_page_to_full(page, mi_page_queue_of(page));
|
||||||
|
}
|
||||||
|
return p;
|
||||||
}
|
}
|
||||||
|
|
|
@ -316,7 +316,7 @@ int main(int argc, char** argv) {
|
||||||
|
|
||||||
#ifndef USE_STD_MALLOC
|
#ifndef USE_STD_MALLOC
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
mi_debug_show_arenas(true);
|
mi_debug_show_arenas();
|
||||||
mi_collect(true);
|
mi_collect(true);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Reference in a new issue