mirror of
https://github.com/microsoft/mimalloc.git
synced 2025-07-06 19:38:41 +03:00
Merge branch 'master' into dev
This commit is contained in:
commit
2fee6f98d7
6 changed files with 20 additions and 7 deletions
|
@ -808,7 +808,7 @@ library so all calls to the standard `malloc` interface are
|
||||||
resolved to the _mimalloc_ library.
|
resolved to the _mimalloc_ library.
|
||||||
|
|
||||||
- `env LD_PRELOAD=/usr/lib/libmimalloc.so myprogram` (on Linux, BSD, etc.)
|
- `env LD_PRELOAD=/usr/lib/libmimalloc.so myprogram` (on Linux, BSD, etc.)
|
||||||
- `env DYLD_INSERT_LIBRARIES=usr/lib/libmimalloc.dylib myprogram` (On macOS)
|
- `env DYLD_INSERT_LIBRARIES=/usr/lib/libmimalloc.dylib myprogram` (On macOS)
|
||||||
|
|
||||||
Note certain security restrictions may apply when doing this from
|
Note certain security restrictions may apply when doing this from
|
||||||
the [shell](https://stackoverflow.com/questions/43941322/dyld-insert-libraries-ignored-when-calling-application-through-bash).
|
the [shell](https://stackoverflow.com/questions/43941322/dyld-insert-libraries-ignored-when-calling-application-through-bash).
|
||||||
|
|
|
@ -109,7 +109,7 @@ $(document).ready(function(){initNavTree('overrides.html','');});
|
||||||
<p>On these systems we preload the mimalloc shared library so all calls to the standard <code>malloc</code> interface are resolved to the <em>mimalloc</em> library.</p>
|
<p>On these systems we preload the mimalloc shared library so all calls to the standard <code>malloc</code> interface are resolved to the <em>mimalloc</em> library.</p>
|
||||||
<ul>
|
<ul>
|
||||||
<li><code>env LD_PRELOAD=/usr/lib/libmimalloc.so myprogram</code> (on Linux, BSD, etc.)</li>
|
<li><code>env LD_PRELOAD=/usr/lib/libmimalloc.so myprogram</code> (on Linux, BSD, etc.)</li>
|
||||||
<li><p class="startli"><code>env DYLD_INSERT_LIBRARIES=usr/lib/libmimalloc.dylib myprogram</code> (On macOS)</p>
|
<li><p class="startli"><code>env DYLD_INSERT_LIBRARIES=/usr/lib/libmimalloc.dylib myprogram</code> (On macOS)</p>
|
||||||
<p class="startli">Note certain security restrictions may apply when doing this from the <a href="https://stackoverflow.com/questions/43941322/dyld-insert-libraries-ignored-when-calling-application-through-bash">shell</a>.</p>
|
<p class="startli">Note certain security restrictions may apply when doing this from the <a href="https://stackoverflow.com/questions/43941322/dyld-insert-libraries-ignored-when-calling-application-through-bash">shell</a>.</p>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
|
@ -116,6 +116,9 @@ bool _mi_page_is_valid(mi_page_t* page);
|
||||||
#define mi_likely(x) (x)
|
#define mi_likely(x) (x)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef __has_builtin
|
||||||
|
#define __has_builtin(x) 0
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(_MSC_VER)
|
#if defined(_MSC_VER)
|
||||||
#define mi_decl_noinline __declspec(noinline)
|
#define mi_decl_noinline __declspec(noinline)
|
||||||
|
@ -148,9 +151,17 @@ bool _mi_page_is_valid(mi_page_t* page);
|
||||||
// Overflow detecting multiply
|
// Overflow detecting multiply
|
||||||
#define MI_MUL_NO_OVERFLOW ((size_t)1 << (4*sizeof(size_t))) // sqrt(SIZE_MAX)
|
#define MI_MUL_NO_OVERFLOW ((size_t)1 << (4*sizeof(size_t))) // sqrt(SIZE_MAX)
|
||||||
static inline bool mi_mul_overflow(size_t size, size_t count, size_t* total) {
|
static inline bool mi_mul_overflow(size_t size, size_t count, size_t* total) {
|
||||||
|
#if __has_builtin(__builtin_umul_overflow) || __GNUC__ >= 5
|
||||||
|
#if (MI_INTPTR_SIZE == 4)
|
||||||
|
return __builtin_umul_overflow(size, count, total);
|
||||||
|
#else
|
||||||
|
return __builtin_umull_overflow(size, count, total);
|
||||||
|
#endif
|
||||||
|
#else /* __builtin_umul_overflow is unavailable */
|
||||||
*total = size * count;
|
*total = size * count;
|
||||||
return ((size >= MI_MUL_NO_OVERFLOW || count >= MI_MUL_NO_OVERFLOW)
|
return ((size >= MI_MUL_NO_OVERFLOW || count >= MI_MUL_NO_OVERFLOW)
|
||||||
&& size > 0 && (SIZE_MAX / size) < count);
|
&& size > 0 && (SIZE_MAX / size) < count);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// Align a byte size to a size in _machine words_,
|
// Align a byte size to a size in _machine words_,
|
||||||
|
|
|
@ -191,7 +191,7 @@ library so all calls to the standard `malloc` interface are
|
||||||
resolved to the _mimalloc_ library.
|
resolved to the _mimalloc_ library.
|
||||||
|
|
||||||
- `env LD_PRELOAD=/usr/lib/libmimalloc.so myprogram` (on Linux, BSD, etc.)
|
- `env LD_PRELOAD=/usr/lib/libmimalloc.so myprogram` (on Linux, BSD, etc.)
|
||||||
- `env DYLD_INSERT_LIBRARIES=usr/lib/libmimalloc.dylib myprogram` (On macOS)
|
- `env DYLD_INSERT_LIBRARIES=/usr/lib/libmimalloc.dylib myprogram` (On macOS)
|
||||||
|
|
||||||
Note certain security restrictions may apply when doing this from
|
Note certain security restrictions may apply when doing this from
|
||||||
the [shell](https://stackoverflow.com/questions/43941322/dyld-insert-libraries-ignored-when-calling-application-through-bash).
|
the [shell](https://stackoverflow.com/questions/43941322/dyld-insert-libraries-ignored-when-calling-application-through-bash).
|
||||||
|
|
|
@ -58,7 +58,7 @@ static void mi_option_init(mi_option_desc_t* desc);
|
||||||
long mi_option_get(mi_option_t option) {
|
long mi_option_get(mi_option_t option) {
|
||||||
mi_assert(option >= 0 && option < _mi_option_last);
|
mi_assert(option >= 0 && option < _mi_option_last);
|
||||||
mi_option_desc_t* desc = &options[option];
|
mi_option_desc_t* desc = &options[option];
|
||||||
if (desc->init == UNINIT) {
|
if (mi_unlikely(desc->init == UNINIT)) {
|
||||||
mi_option_init(desc);
|
mi_option_init(desc);
|
||||||
if (option != mi_option_verbose) {
|
if (option != mi_option_verbose) {
|
||||||
_mi_verbose_message("option '%s': %ld\n", desc->name, desc->value);
|
_mi_verbose_message("option '%s': %ld\n", desc->name, desc->value);
|
||||||
|
@ -183,7 +183,8 @@ static void mi_option_init(mi_option_desc_t* desc) {
|
||||||
#pragma warning(suppress:4996)
|
#pragma warning(suppress:4996)
|
||||||
char* s = getenv(buf);
|
char* s = getenv(buf);
|
||||||
if (s == NULL) {
|
if (s == NULL) {
|
||||||
for (size_t i = 0; i < strlen(buf); i++) {
|
size_t buf_size = strlen(buf);
|
||||||
|
for (size_t i = 0; i < buf_size; i++) {
|
||||||
buf[i] = toupper(buf[i]);
|
buf[i] = toupper(buf[i]);
|
||||||
}
|
}
|
||||||
#pragma warning(suppress:4996)
|
#pragma warning(suppress:4996)
|
||||||
|
@ -191,7 +192,8 @@ static void mi_option_init(mi_option_desc_t* desc) {
|
||||||
}
|
}
|
||||||
if (s != NULL) {
|
if (s != NULL) {
|
||||||
mi_strlcpy(buf, s, sizeof(buf));
|
mi_strlcpy(buf, s, sizeof(buf));
|
||||||
for (size_t i = 0; i < strlen(buf); i++) {
|
size_t buf_size = strlen(buf); // TODO: use strnlen?
|
||||||
|
for (size_t i = 0; i < buf_size; i++) {
|
||||||
buf[i] = toupper(buf[i]);
|
buf[i] = toupper(buf[i]);
|
||||||
}
|
}
|
||||||
if (buf[0]==0 || strstr("1;TRUE;YES;ON", buf) != NULL) {
|
if (buf[0]==0 || strstr("1;TRUE;YES;ON", buf) != NULL) {
|
||||||
|
|
2
src/os.c
2
src/os.c
|
@ -209,7 +209,7 @@ static void* mi_win_virtual_alloc(void* addr, size_t size, size_t try_alignment,
|
||||||
void* p = NULL;
|
void* p = NULL;
|
||||||
if (use_large_os_page(size, try_alignment)) {
|
if (use_large_os_page(size, try_alignment)) {
|
||||||
if (large_page_try_ok > 0) {
|
if (large_page_try_ok > 0) {
|
||||||
// if a large page page allocation fails, it seems the calls to VirtualAlloc get very expensive.
|
// if a large page allocation fails, it seems the calls to VirtualAlloc get very expensive.
|
||||||
// therefore, once a large page allocation failed, we don't try again for `large_page_try_ok` times.
|
// therefore, once a large page allocation failed, we don't try again for `large_page_try_ok` times.
|
||||||
large_page_try_ok--;
|
large_page_try_ok--;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue