Darwin malloc_size override support proposal.
Darwin has similar api than Linux/FreeBSD's malloc_usable_size.
This commit is contained in:
parent
ab0f1604b4
commit
cf9724531a
@ -1056,6 +1056,9 @@ AC_CHECK_FUNC([memalign],
|
||||
AC_CHECK_FUNC([valloc],
|
||||
[AC_DEFINE([JEMALLOC_OVERRIDE_VALLOC], [ ])
|
||||
public_syms="${public_syms} valloc"])
|
||||
AC_CHECK_FUNC([malloc_size],
|
||||
[AC_DEFINE([JEMALLOC_HAVE_MALLOC_SIZE], [ ])
|
||||
public_syms="${public_syms} malloc_size"])
|
||||
|
||||
dnl Check for allocator-related functions that should be wrapped.
|
||||
wrap_syms=
|
||||
|
@ -337,6 +337,11 @@
|
||||
*/
|
||||
#undef JEMALLOC_HAVE_MEMCNTL
|
||||
|
||||
/*
|
||||
* Defined if malloc_size is supported
|
||||
*/
|
||||
#undef JEMALLOC_HAVE_MALLOC_SIZE
|
||||
|
||||
/* Define if operating system has alloca.h header. */
|
||||
#undef JEMALLOC_HAS_ALLOCA_H
|
||||
|
||||
|
@ -53,6 +53,10 @@ JEMALLOC_EXPORT void JEMALLOC_NOTHROW @je_@malloc_stats_print(
|
||||
const char *opts);
|
||||
JEMALLOC_EXPORT size_t JEMALLOC_NOTHROW @je_@malloc_usable_size(
|
||||
JEMALLOC_USABLE_SIZE_CONST void *ptr) JEMALLOC_CXX_THROW;
|
||||
#ifdef JEMALLOC_HAVE_MALLOC_SIZE
|
||||
JEMALLOC_EXPORT size_t JEMALLOC_NOTHROW @je_@malloc_size(
|
||||
const void *ptr);
|
||||
#endif
|
||||
|
||||
#ifdef JEMALLOC_OVERRIDE_MEMALIGN
|
||||
JEMALLOC_EXPORT JEMALLOC_ALLOCATOR JEMALLOC_RESTRICT_RETURN
|
||||
|
@ -3904,18 +3904,14 @@ je_malloc_stats_print(void (*write_cb)(void *, const char *), void *cbopaque,
|
||||
}
|
||||
#undef STATS_PRINT_BUFSIZE
|
||||
|
||||
JEMALLOC_EXPORT size_t JEMALLOC_NOTHROW
|
||||
je_malloc_usable_size(JEMALLOC_USABLE_SIZE_CONST void *ptr) {
|
||||
size_t ret;
|
||||
tsdn_t *tsdn;
|
||||
|
||||
LOG("core.malloc_usable_size.entry", "ptr: %p", ptr);
|
||||
|
||||
JEMALLOC_ALWAYS_INLINE size_t
|
||||
je_malloc_usable_size_impl(JEMALLOC_USABLE_SIZE_CONST void *ptr) {
|
||||
assert(malloc_initialized() || IS_INITIALIZER);
|
||||
|
||||
tsdn = tsdn_fetch();
|
||||
tsdn_t *tsdn = tsdn_fetch();
|
||||
check_entry_exit_locking(tsdn);
|
||||
|
||||
size_t ret;
|
||||
if (unlikely(ptr == NULL)) {
|
||||
ret = 0;
|
||||
} else {
|
||||
@ -3926,12 +3922,33 @@ je_malloc_usable_size(JEMALLOC_USABLE_SIZE_CONST void *ptr) {
|
||||
ret = isalloc(tsdn, ptr);
|
||||
}
|
||||
}
|
||||
|
||||
check_entry_exit_locking(tsdn);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
JEMALLOC_EXPORT size_t JEMALLOC_NOTHROW
|
||||
je_malloc_usable_size(JEMALLOC_USABLE_SIZE_CONST void *ptr) {
|
||||
LOG("core.malloc_usable_size.entry", "ptr: %p", ptr);
|
||||
|
||||
size_t ret = je_malloc_usable_size_impl(ptr);
|
||||
|
||||
LOG("core.malloc_usable_size.exit", "result: %zu", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
#ifdef JEMALLOC_HAVE_MALLOC_SIZE
|
||||
JEMALLOC_EXPORT size_t JEMALLOC_NOTHROW
|
||||
je_malloc_size(const void *ptr) {
|
||||
LOG("core.malloc_size.entry", "ptr: %p", ptr);
|
||||
|
||||
size_t ret = je_malloc_usable_size_impl(ptr);
|
||||
|
||||
LOG("core.malloc_size.exit", "result: %zu", ret);
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
static void
|
||||
batch_alloc_prof_sample_assert(tsd_t *tsd, size_t batch, size_t usize) {
|
||||
assert(config_prof && opt_prof);
|
||||
|
@ -132,6 +132,11 @@ static const bool config_debug =
|
||||
#define MEXP 19937
|
||||
#include "test/SFMT.h"
|
||||
|
||||
#ifndef JEMALLOC_HAVE_MALLOC_SIZE
|
||||
#define TEST_MALLOC_SIZE malloc_usable_size
|
||||
#else
|
||||
#define TEST_MALLOC_SIZE malloc_size
|
||||
#endif
|
||||
/******************************************************************************/
|
||||
/*
|
||||
* Define always-enabled assertion macros, so that test assertions execute even
|
||||
|
@ -120,7 +120,7 @@ TEST_BEGIN(test_alignment_and_size) {
|
||||
"size=%zu (%#zx): %s",
|
||||
alignment, size, size, buf);
|
||||
}
|
||||
total += malloc_usable_size(ps[i]);
|
||||
total += TEST_MALLOC_SIZE(ps[i]);
|
||||
if (total >= (MAXALIGN << 1)) {
|
||||
break;
|
||||
}
|
||||
@ -141,7 +141,7 @@ TEST_END
|
||||
TEST_BEGIN(test_zero_alloc) {
|
||||
void *res = aligned_alloc(8, 0);
|
||||
assert(res);
|
||||
size_t usable = malloc_usable_size(res);
|
||||
size_t usable = TEST_MALLOC_SIZE(res);
|
||||
assert(usable > 0);
|
||||
free(res);
|
||||
}
|
||||
|
@ -70,7 +70,7 @@ thd_start(void *arg) {
|
||||
expect_ptr_eq(ap0, ap1,
|
||||
"Pointer returned by \"thread.allocatedp\" should not change");
|
||||
|
||||
usize = malloc_usable_size(p);
|
||||
usize = TEST_MALLOC_SIZE(p);
|
||||
expect_u64_le(a0 + usize, a1,
|
||||
"Allocated memory counter should increase by at least the amount "
|
||||
"explicitly allocated");
|
||||
|
@ -3,7 +3,7 @@
|
||||
TEST_BEGIN(test_zero_alloc) {
|
||||
void *res = malloc(0);
|
||||
assert(res);
|
||||
size_t usable = malloc_usable_size(res);
|
||||
size_t usable = TEST_MALLOC_SIZE(res);
|
||||
assert(usable > 0);
|
||||
free(res);
|
||||
}
|
||||
|
@ -101,7 +101,7 @@ TEST_BEGIN(test_alignment_and_size) {
|
||||
"size=%zu (%#zx): %s",
|
||||
alignment, size, size, buf);
|
||||
}
|
||||
total += malloc_usable_size(ps[i]);
|
||||
total += TEST_MALLOC_SIZE(ps[i]);
|
||||
if (total >= (MAXALIGN << 1)) {
|
||||
break;
|
||||
}
|
||||
|
@ -185,7 +185,7 @@ TEST_BEGIN(test_align_enum) {
|
||||
assert_ptr_not_null(p,
|
||||
"Unexpected mallocx() error");
|
||||
assert_zu_eq(nallocx(1, flags),
|
||||
malloc_usable_size(p),
|
||||
TEST_MALLOC_SIZE(p),
|
||||
"Wrong mallocx() usable size");
|
||||
int flags_next =
|
||||
MALLOCX_LG_ALIGN(lg_align_next);
|
||||
@ -193,7 +193,7 @@ TEST_BEGIN(test_align_enum) {
|
||||
assert_ptr_not_null(p,
|
||||
"Unexpected rallocx() error");
|
||||
expect_zu_eq(nallocx(size, flags_next),
|
||||
malloc_usable_size(p),
|
||||
TEST_MALLOC_SIZE(p),
|
||||
"Wrong rallocx() usable size");
|
||||
free(p);
|
||||
}
|
||||
|
@ -69,7 +69,7 @@ malloc_mus_free(void) {
|
||||
test_fail("Unexpected malloc() failure");
|
||||
return;
|
||||
}
|
||||
malloc_usable_size(p);
|
||||
TEST_MALLOC_SIZE(p);
|
||||
free(p);
|
||||
}
|
||||
|
||||
|
@ -30,7 +30,7 @@ do_allocs(size_t size, bool zero, size_t lg_align) {
|
||||
if (opt_junk_alloc && !zero) { \
|
||||
expect_ptr_eq(ptr, last_junked_ptr, ""); \
|
||||
expect_zu_eq(last_junked_usize, \
|
||||
malloc_usable_size(ptr), ""); \
|
||||
TEST_MALLOC_SIZE(ptr), ""); \
|
||||
} \
|
||||
} while (0)
|
||||
if (!zero && lg_align == 0) {
|
||||
|
@ -43,7 +43,7 @@ test_combinations(szind_t ind, size_t sizes_array[N_PTRS],
|
||||
int flags = flags_array[i];
|
||||
void *p = mallocx(sz, flags);
|
||||
assert_ptr_not_null(p, "malloc() failed");
|
||||
assert(malloc_usable_size(p) == sz_index2size(ind));
|
||||
assert(TEST_MALLOC_SIZE(p) == sz_index2size(ind));
|
||||
ptrs[i] = p;
|
||||
live_req_sum += sz;
|
||||
live_count++;
|
||||
|
Loading…
Reference in New Issue
Block a user