Optimize compute_size_with_overflow().
Do not check for overflow unless it is actually a possibility.
This commit is contained in:
parent
767ffa2b5f
commit
1bac516aaa
@ -1362,6 +1362,8 @@ malloc_init_hard(void) {
|
|||||||
*/
|
*/
|
||||||
typedef struct static_opts_s static_opts_t;
|
typedef struct static_opts_s static_opts_t;
|
||||||
struct static_opts_s {
|
struct static_opts_s {
|
||||||
|
/* Whether or not allocation size may overflow. */
|
||||||
|
bool may_overflow;
|
||||||
/* Whether or not allocations of size 0 should be treated as size 1. */
|
/* Whether or not allocations of size 0 should be treated as size 1. */
|
||||||
bool bump_empty_alloc;
|
bool bump_empty_alloc;
|
||||||
/*
|
/*
|
||||||
@ -1400,6 +1402,7 @@ struct static_opts_s {
|
|||||||
|
|
||||||
JEMALLOC_ALWAYS_INLINE_C void
|
JEMALLOC_ALWAYS_INLINE_C void
|
||||||
static_opts_init(static_opts_t *static_opts) {
|
static_opts_init(static_opts_t *static_opts) {
|
||||||
|
static_opts->may_overflow = false;
|
||||||
static_opts->bump_empty_alloc = false;
|
static_opts->bump_empty_alloc = false;
|
||||||
static_opts->assert_nonempty_alloc = false;
|
static_opts->assert_nonempty_alloc = false;
|
||||||
static_opts->null_out_result_on_error = false;
|
static_opts->null_out_result_on_error = false;
|
||||||
@ -1514,12 +1517,19 @@ imalloc_sample(static_opts_t *sopts, dynamic_opts_t *dopts, tsd_t *tsd,
|
|||||||
* *size to the product either way.
|
* *size to the product either way.
|
||||||
*/
|
*/
|
||||||
JEMALLOC_ALWAYS_INLINE_C bool
|
JEMALLOC_ALWAYS_INLINE_C bool
|
||||||
compute_size_with_overflow(dynamic_opts_t *dopts, size_t *size) {
|
compute_size_with_overflow(bool may_overflow, dynamic_opts_t *dopts,
|
||||||
|
size_t *size) {
|
||||||
/*
|
/*
|
||||||
* This function is just num_items * item_size, except that we have to
|
* This function is just num_items * item_size, except that we may have
|
||||||
* check for overflow.
|
* to check for overflow.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
if (!may_overflow) {
|
||||||
|
assert(dopts->num_items == 1);
|
||||||
|
*size = dopts->item_size;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/* A size_t with its high-half bits all set to 1. */
|
/* A size_t with its high-half bits all set to 1. */
|
||||||
const static size_t high_bits = SIZE_T_MAX << (sizeof(size_t) * 8 / 2);
|
const static size_t high_bits = SIZE_T_MAX << (sizeof(size_t) * 8 / 2);
|
||||||
|
|
||||||
@ -1572,8 +1582,8 @@ imalloc_body(static_opts_t *sopts, dynamic_opts_t *dopts) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Compute the amount of memory the user wants. */
|
/* Compute the amount of memory the user wants. */
|
||||||
bool overflow = compute_size_with_overflow(dopts, &size);
|
if (unlikely(compute_size_with_overflow(sopts->may_overflow, dopts,
|
||||||
if (unlikely(overflow)) {
|
&size))) {
|
||||||
goto label_oom;
|
goto label_oom;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1843,6 +1853,7 @@ je_calloc(size_t num, size_t size) {
|
|||||||
static_opts_init(&sopts);
|
static_opts_init(&sopts);
|
||||||
dynamic_opts_init(&dopts);
|
dynamic_opts_init(&dopts);
|
||||||
|
|
||||||
|
sopts.may_overflow = true;
|
||||||
sopts.bump_empty_alloc = true;
|
sopts.bump_empty_alloc = true;
|
||||||
sopts.null_out_result_on_error = true;
|
sopts.null_out_result_on_error = true;
|
||||||
sopts.set_errno_on_error = true;
|
sopts.set_errno_on_error = true;
|
||||||
|
Loading…
Reference in New Issue
Block a user