mirror of
https://github.com/microsoft/mimalloc.git
synced 2025-05-04 22:49:32 +03:00
add preload check to options initialization
This commit is contained in:
parent
a407f35c64
commit
36d168a2d9
1 changed files with 13 additions and 9 deletions
|
@ -28,7 +28,7 @@ int mi_version(void) mi_attr_noexcept {
|
||||||
|
|
||||||
// --------------------------------------------------------
|
// --------------------------------------------------------
|
||||||
// Options
|
// Options
|
||||||
// These can be accessed by multiple threads and may be
|
// These can be accessed by multiple threads and may be
|
||||||
// concurrently initialized, but an initializing data race
|
// concurrently initialized, but an initializing data race
|
||||||
// is ok since they resolve to the same value.
|
// is ok since they resolve to the same value.
|
||||||
// --------------------------------------------------------
|
// --------------------------------------------------------
|
||||||
|
@ -61,7 +61,7 @@ static mi_option_desc_t options[_mi_option_last] =
|
||||||
{ 0, UNINIT, MI_OPTION(eager_region_commit) },
|
{ 0, UNINIT, MI_OPTION(eager_region_commit) },
|
||||||
{ 1, UNINIT, MI_OPTION(reset_decommits) }, // reset decommits memory
|
{ 1, UNINIT, MI_OPTION(reset_decommits) }, // reset decommits memory
|
||||||
#else
|
#else
|
||||||
{ 1, UNINIT, MI_OPTION(eager_region_commit) },
|
{ 1, UNINIT, MI_OPTION(eager_region_commit) },
|
||||||
{ 0, UNINIT, MI_OPTION(reset_decommits) }, // reset uses MADV_FREE/MADV_DONTNEED
|
{ 0, UNINIT, MI_OPTION(reset_decommits) }, // reset uses MADV_FREE/MADV_DONTNEED
|
||||||
#endif
|
#endif
|
||||||
{ 0, UNINIT, MI_OPTION(large_os_pages) }, // use large OS pages, use only with eager commit to prevent fragmentation of VMA's
|
{ 0, UNINIT, MI_OPTION(large_os_pages) }, // use large OS pages, use only with eager commit to prevent fragmentation of VMA's
|
||||||
|
@ -71,7 +71,7 @@ static mi_option_desc_t options[_mi_option_last] =
|
||||||
{ 0, UNINIT, MI_OPTION(segment_reset) }, // reset segment memory on free (needs eager commit)
|
{ 0, UNINIT, MI_OPTION(segment_reset) }, // reset segment memory on free (needs eager commit)
|
||||||
{ 0, UNINIT, MI_OPTION(eager_commit_delay) }, // the first N segments per thread are not eagerly committed
|
{ 0, UNINIT, MI_OPTION(eager_commit_delay) }, // the first N segments per thread are not eagerly committed
|
||||||
{ 500, UNINIT, MI_OPTION(reset_delay) }, // reset delay in milli-seconds
|
{ 500, UNINIT, MI_OPTION(reset_delay) }, // reset delay in milli-seconds
|
||||||
{ 0, UNINIT, MI_OPTION(use_numa_nodes) }, // 0 = use available numa nodes, otherwise use at most N nodes.
|
{ 0, UNINIT, MI_OPTION(use_numa_nodes) }, // 0 = use available numa nodes, otherwise use at most N nodes.
|
||||||
{ 100, UNINIT, MI_OPTION(os_tag) }, // only apple specific for now but might serve more or less related purpose
|
{ 100, UNINIT, MI_OPTION(os_tag) }, // only apple specific for now but might serve more or less related purpose
|
||||||
{ 16, UNINIT, MI_OPTION(max_errors) } // maximum errors that are output
|
{ 16, UNINIT, MI_OPTION(max_errors) } // maximum errors that are output
|
||||||
};
|
};
|
||||||
|
@ -89,7 +89,7 @@ void _mi_options_init(void) {
|
||||||
mi_option_desc_t* desc = &options[option];
|
mi_option_desc_t* desc = &options[option];
|
||||||
_mi_verbose_message("option '%s': %ld\n", desc->name, desc->value);
|
_mi_verbose_message("option '%s': %ld\n", desc->name, desc->value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mi_max_error_count = mi_option_get(mi_option_max_errors);
|
mi_max_error_count = mi_option_get(mi_option_max_errors);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -98,7 +98,7 @@ long mi_option_get(mi_option_t option) {
|
||||||
mi_option_desc_t* desc = &options[option];
|
mi_option_desc_t* desc = &options[option];
|
||||||
mi_assert(desc->option == option); // index should match the option
|
mi_assert(desc->option == option); // index should match the option
|
||||||
if (mi_unlikely(desc->init == UNINIT)) {
|
if (mi_unlikely(desc->init == UNINIT)) {
|
||||||
mi_option_init(desc);
|
mi_option_init(desc);
|
||||||
}
|
}
|
||||||
return desc->value;
|
return desc->value;
|
||||||
}
|
}
|
||||||
|
@ -142,7 +142,7 @@ void mi_option_disable(mi_option_t option) {
|
||||||
|
|
||||||
static void mi_out_stderr(const char* msg) {
|
static void mi_out_stderr(const char* msg) {
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
// on windows with redirection, the C runtime cannot handle locale dependent output
|
// on windows with redirection, the C runtime cannot handle locale dependent output
|
||||||
// after the main thread closes so we use direct console output.
|
// after the main thread closes so we use direct console output.
|
||||||
if (!_mi_preloading()) { _cputs(msg); }
|
if (!_mi_preloading()) { _cputs(msg); }
|
||||||
#else
|
#else
|
||||||
|
@ -184,7 +184,7 @@ static void mi_out_buf_flush(mi_output_fun* out, bool no_more_buf) {
|
||||||
out_buf[count] = 0;
|
out_buf[count] = 0;
|
||||||
out(out_buf);
|
out(out_buf);
|
||||||
if (!no_more_buf) {
|
if (!no_more_buf) {
|
||||||
out_buf[count] = '\n'; // if continue with the buffer, insert a newline
|
out_buf[count] = '\n'; // if continue with the buffer, insert a newline
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -340,7 +340,7 @@ static void mi_strlcat(char* dest, const char* src, size_t dest_size) {
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
static bool mi_getenv(const char* name, char* result, size_t result_size) {
|
static bool mi_getenv(const char* name, char* result, size_t result_size) {
|
||||||
result[0] = 0;
|
result[0] = 0;
|
||||||
size_t len = GetEnvironmentVariableA(name, result, (DWORD)result_size);
|
size_t len = GetEnvironmentVariableA(name, result, (DWORD)result_size);
|
||||||
return (len > 0 && len < result_size);
|
return (len > 0 && len < result_size);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
@ -366,7 +366,11 @@ static bool mi_getenv(const char* name, char* result, size_t result_size) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
static void mi_option_init(mi_option_desc_t* desc) {
|
static void mi_option_init(mi_option_desc_t* desc) {
|
||||||
|
#ifndef _WIN32
|
||||||
|
// cannot call getenv() when still initializing the C runtime.
|
||||||
|
if (_mi_preloading()) return;
|
||||||
|
#endif
|
||||||
// Read option value from the environment
|
// Read option value from the environment
|
||||||
char buf[64+1];
|
char buf[64+1];
|
||||||
mi_strlcpy(buf, "mimalloc_", sizeof(buf));
|
mi_strlcpy(buf, "mimalloc_", sizeof(buf));
|
||||||
|
|
Loading…
Add table
Reference in a new issue