mirror of
https://github.com/jemalloc/jemalloc.git
synced 2026-07-08 23:07:20 +03:00
Replace experimental_infallible_new with compile-time flag
The runtime option aborted on every OOM, breaking new(std::nothrow) semantics. Replace with configure-time --enable-cxx-infallible-new (default off): when on, throwing new aborts (size logged) and nothrow returns null; when off, standard new_handler + bad_alloc / null behavior is preserved. Under LTO the on-path lets the compiler prove operator new is no-throw.
This commit is contained in:
parent
a6048680a8
commit
160ab9d7f6
19 changed files with 103 additions and 44 deletions
|
|
@ -731,11 +731,6 @@ malloc_conf_init_helper(sc_data_t *sc_data, unsigned bin_shard_sizes[SC_NBINS],
|
|||
if (config_xmalloc) {
|
||||
CONF_HANDLE_BOOL(opt_xmalloc, "xmalloc")
|
||||
}
|
||||
if (config_enable_cxx) {
|
||||
CONF_HANDLE_BOOL(
|
||||
opt_experimental_infallible_new,
|
||||
"experimental_infallible_new")
|
||||
}
|
||||
|
||||
CONF_HANDLE_BOOL(opt_experimental_tcache_gc,
|
||||
"experimental_tcache_gc")
|
||||
|
|
|
|||
|
|
@ -91,6 +91,7 @@ CTL_PROTO(thread_idle)
|
|||
CTL_PROTO(config_cache_oblivious)
|
||||
CTL_PROTO(config_debug)
|
||||
CTL_PROTO(config_fill)
|
||||
CTL_PROTO(config_infallible_new)
|
||||
CTL_PROTO(config_lazy_lock)
|
||||
CTL_PROTO(config_malloc_conf)
|
||||
CTL_PROTO(config_opt_safety_checks)
|
||||
|
|
@ -143,7 +144,6 @@ CTL_PROTO(opt_junk)
|
|||
CTL_PROTO(opt_zero)
|
||||
CTL_PROTO(opt_utrace)
|
||||
CTL_PROTO(opt_xmalloc)
|
||||
CTL_PROTO(opt_experimental_infallible_new)
|
||||
CTL_PROTO(opt_experimental_tcache_gc)
|
||||
CTL_PROTO(opt_tcache)
|
||||
CTL_PROTO(opt_tcache_max)
|
||||
|
|
@ -458,6 +458,7 @@ static const ctl_named_node_t thread_node[] = {
|
|||
static const ctl_named_node_t config_node[] = {
|
||||
{NAME("cache_oblivious"), CTL(config_cache_oblivious)},
|
||||
{NAME("debug"), CTL(config_debug)}, {NAME("fill"), CTL(config_fill)},
|
||||
{NAME("infallible_new"), CTL(config_infallible_new)},
|
||||
{NAME("lazy_lock"), CTL(config_lazy_lock)},
|
||||
{NAME("malloc_conf"), CTL(config_malloc_conf)},
|
||||
{NAME("opt_safety_checks"), CTL(config_opt_safety_checks)},
|
||||
|
|
@ -513,7 +514,6 @@ static const ctl_named_node_t opt_node[] = {{NAME("abort"), CTL(opt_abort)},
|
|||
{NAME("stats_interval_opts"), CTL(opt_stats_interval_opts)},
|
||||
{NAME("junk"), CTL(opt_junk)}, {NAME("zero"), CTL(opt_zero)},
|
||||
{NAME("utrace"), CTL(opt_utrace)}, {NAME("xmalloc"), CTL(opt_xmalloc)},
|
||||
{NAME("experimental_infallible_new"), CTL(opt_experimental_infallible_new)},
|
||||
{NAME("experimental_tcache_gc"), CTL(opt_experimental_tcache_gc)},
|
||||
{NAME("tcache"), CTL(opt_tcache)},
|
||||
{NAME("tcache_max"), CTL(opt_tcache_max)},
|
||||
|
|
@ -2184,6 +2184,7 @@ label_return:
|
|||
CTL_RO_CONFIG_GEN(config_cache_oblivious, bool)
|
||||
CTL_RO_CONFIG_GEN(config_debug, bool)
|
||||
CTL_RO_CONFIG_GEN(config_fill, bool)
|
||||
CTL_RO_CONFIG_GEN(config_infallible_new, bool)
|
||||
CTL_RO_CONFIG_GEN(config_lazy_lock, bool)
|
||||
CTL_RO_CONFIG_GEN(config_malloc_conf, const char *)
|
||||
CTL_RO_CONFIG_GEN(config_opt_safety_checks, bool)
|
||||
|
|
@ -2257,8 +2258,6 @@ CTL_RO_NL_CGEN(config_fill, opt_junk, opt_junk, const char *)
|
|||
CTL_RO_NL_CGEN(config_fill, opt_zero, opt_zero, bool)
|
||||
CTL_RO_NL_CGEN(config_utrace, opt_utrace, opt_utrace, bool)
|
||||
CTL_RO_NL_CGEN(config_xmalloc, opt_xmalloc, opt_xmalloc, bool)
|
||||
CTL_RO_NL_CGEN(config_enable_cxx, opt_experimental_infallible_new,
|
||||
opt_experimental_infallible_new, bool)
|
||||
CTL_RO_NL_GEN(opt_experimental_tcache_gc, opt_experimental_tcache_gc, bool)
|
||||
CTL_RO_NL_GEN(opt_tcache, opt_tcache, bool)
|
||||
CTL_RO_NL_GEN(opt_tcache_max, opt_tcache_max, size_t)
|
||||
|
|
|
|||
|
|
@ -182,7 +182,6 @@ void (*JET_MUTABLE invalid_conf_abort)(void) = &abort;
|
|||
|
||||
bool opt_utrace = false;
|
||||
bool opt_xmalloc = false;
|
||||
bool opt_experimental_infallible_new = false;
|
||||
bool opt_experimental_tcache_gc = true;
|
||||
bool opt_zero = false;
|
||||
unsigned opt_narenas = 0;
|
||||
|
|
|
|||
|
|
@ -66,20 +66,20 @@ void operator delete[](
|
|||
JEMALLOC_NOINLINE
|
||||
static void *
|
||||
handleOOM(std::size_t size, bool nothrow) {
|
||||
if (opt_experimental_infallible_new) {
|
||||
const char *huge_warning = (size >= ((std::size_t)1 << 30))
|
||||
? "This may be caused by heap corruption, if the large size "
|
||||
"is unexpected (suggest building with sanitizers for "
|
||||
"debugging)."
|
||||
: "";
|
||||
|
||||
safety_check_fail(
|
||||
"<jemalloc>: Allocation of size %zu failed. "
|
||||
"%s opt.experimental_infallible_new is true. Aborting.\n",
|
||||
size, huge_warning);
|
||||
#ifdef JEMALLOC_INFALLIBLE_NEW
|
||||
if (nothrow) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
const char *huge_warning = (size >= ((std::size_t)1 << 30))
|
||||
? "This may be caused by heap corruption, if the large size "
|
||||
"is unexpected (suggest building with sanitizers for "
|
||||
"debugging). "
|
||||
: "";
|
||||
safety_check_fail(
|
||||
"<jemalloc>: Allocation of size %zu failed. %sAborting.\n",
|
||||
size, huge_warning);
|
||||
return nullptr;
|
||||
#else
|
||||
void *ptr = nullptr;
|
||||
|
||||
while (ptr == nullptr) {
|
||||
|
|
@ -108,6 +108,7 @@ handleOOM(std::size_t size, bool nothrow) {
|
|||
#endif
|
||||
}
|
||||
return ptr;
|
||||
#endif
|
||||
}
|
||||
|
||||
template <bool IsNoExcept>
|
||||
|
|
|
|||
|
|
@ -1623,6 +1623,7 @@ stats_general_print(emitter_t *emitter) {
|
|||
CONFIG_WRITE_BOOL(cache_oblivious);
|
||||
CONFIG_WRITE_BOOL(debug);
|
||||
CONFIG_WRITE_BOOL(fill);
|
||||
CONFIG_WRITE_BOOL(infallible_new);
|
||||
CONFIG_WRITE_BOOL(lazy_lock);
|
||||
emitter_kv(emitter, "malloc_conf", "config.malloc_conf",
|
||||
emitter_type_string, &config_malloc_conf);
|
||||
|
|
@ -1774,7 +1775,6 @@ stats_general_print(emitter_t *emitter) {
|
|||
OPT_WRITE_BOOL("zero")
|
||||
OPT_WRITE_BOOL("utrace")
|
||||
OPT_WRITE_BOOL("xmalloc")
|
||||
OPT_WRITE_BOOL("experimental_infallible_new")
|
||||
OPT_WRITE_BOOL("experimental_tcache_gc")
|
||||
OPT_WRITE_BOOL("tcache")
|
||||
OPT_WRITE_SIZE_T("tcache_max")
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue