aboutsummaryrefslogtreecommitdiff
path: root/test/integration
diff options
context:
space:
mode:
authorWarner Losh <imp@FreeBSD.org>2025-02-05 23:20:13 +0000
committerWarner Losh <imp@FreeBSD.org>2025-02-05 23:20:13 +0000
commit48ec896efb0b78141df004eaa21288b84590c9da (patch)
tree33799792fd95c266d472ab1ae51d50ab4f942eb3 /test/integration
parentd28d7fbede216494aa3942af042cc084fcd6098a (diff)
jemalloc: Import 5.3.0 54eaed1d8b56b1aa528be3bdd1877e59c56fa90cvendor/jemalloc/5.3.0vendor/jemalloc
Import jemalloc 5.3.0. This import changes how manage the jemalloc vendor branch (which was just started anyway). Starting with 5.3.0, we import a clean tree from the upstream github, removing all the old files that are no longer upstream, or that we've kept around for some reason. We do this because we merge from this raw version of jemalloc into the FreeBSD contrib/jemalloc, then we run autogen stuff, generate all the generated .h files with gmake, then finally remove much of the generated files in contrib/jemalloc using an update script. Sponsored by: Netflix
Diffstat (limited to 'test/integration')
-rw-r--r--test/integration/MALLOCX_ARENA.c8
-rw-r--r--test/integration/aligned_alloc.c16
-rw-r--r--test/integration/allocated.c22
-rw-r--r--test/integration/cpp/basic.cpp5
-rw-r--r--test/integration/cpp/infallible_new_false.cpp23
-rw-r--r--test/integration/cpp/infallible_new_false.sh8
-rw-r--r--test/integration/cpp/infallible_new_true.cpp67
-rw-r--r--test/integration/cpp/infallible_new_true.sh8
-rw-r--r--test/integration/extent.c155
-rw-r--r--test/integration/malloc.c2
-rw-r--r--test/integration/mallocx.c56
-rw-r--r--test/integration/overflow.c20
-rw-r--r--test/integration/posix_memalign.c14
-rw-r--r--test/integration/rallocx.c118
-rw-r--r--test/integration/slab_sizes.c22
-rw-r--r--test/integration/smallocx.c66
-rw-r--r--test/integration/thread_arena.c10
-rw-r--r--test/integration/thread_tcache_enabled.c38
-rw-r--r--test/integration/xallocx.c110
19 files changed, 481 insertions, 287 deletions
diff --git a/test/integration/MALLOCX_ARENA.c b/test/integration/MALLOCX_ARENA.c
index 222164d69a08..7e61df082cbd 100644
--- a/test/integration/MALLOCX_ARENA.c
+++ b/test/integration/MALLOCX_ARENA.c
@@ -18,7 +18,7 @@ thd_start(void *arg) {
size_t sz;
sz = sizeof(arena_ind);
- assert_d_eq(mallctl("arenas.create", (void *)&arena_ind, &sz, NULL, 0),
+ expect_d_eq(mallctl("arenas.create", (void *)&arena_ind, &sz, NULL, 0),
0, "Error in arenas.create");
if (thread_ind % 4 != 3) {
@@ -29,16 +29,16 @@ thd_start(void *arg) {
(sizeof(dss_precs)/sizeof(char*));
const char *dss = dss_precs[prec_ind];
int expected_err = (have_dss || prec_ind == 0) ? 0 : EFAULT;
- assert_d_eq(mallctlnametomib("arena.0.dss", mib, &miblen), 0,
+ expect_d_eq(mallctlnametomib("arena.0.dss", mib, &miblen), 0,
"Error in mallctlnametomib()");
mib[1] = arena_ind;
- assert_d_eq(mallctlbymib(mib, miblen, NULL, NULL, (void *)&dss,
+ expect_d_eq(mallctlbymib(mib, miblen, NULL, NULL, (void *)&dss,
sizeof(const char *)), expected_err,
"Error in mallctlbymib()");
}
p = mallocx(1, MALLOCX_ARENA(arena_ind));
- assert_ptr_not_null(p, "Unexpected mallocx() error");
+ expect_ptr_not_null(p, "Unexpected mallocx() error");
dallocx(p, 0);
return NULL;
diff --git a/test/integration/aligned_alloc.c b/test/integration/aligned_alloc.c
index 4375b172ad6c..b37d5ba0bf79 100644
--- a/test/integration/aligned_alloc.c
+++ b/test/integration/aligned_alloc.c
@@ -9,7 +9,7 @@
*/
static void
purge(void) {
- assert_d_eq(mallctl("arena.0.purge", NULL, NULL, NULL, 0), 0,
+ expect_d_eq(mallctl("arena.0.purge", NULL, NULL, NULL, 0), 0,
"Unexpected mallctl error");
}
@@ -20,14 +20,14 @@ TEST_BEGIN(test_alignment_errors) {
alignment = 0;
set_errno(0);
p = aligned_alloc(alignment, 1);
- assert_false(p != NULL || get_errno() != EINVAL,
+ expect_false(p != NULL || get_errno() != EINVAL,
"Expected error for invalid alignment %zu", alignment);
for (alignment = sizeof(size_t); alignment < MAXALIGN;
alignment <<= 1) {
set_errno(0);
p = aligned_alloc(alignment + 1, 1);
- assert_false(p != NULL || get_errno() != EINVAL,
+ expect_false(p != NULL || get_errno() != EINVAL,
"Expected error for invalid alignment %zu",
alignment + 1);
}
@@ -58,7 +58,7 @@ TEST_BEGIN(test_oom_errors) {
#endif
set_errno(0);
p = aligned_alloc(alignment, size);
- assert_false(p != NULL || get_errno() != ENOMEM,
+ expect_false(p != NULL || get_errno() != ENOMEM,
"Expected error for aligned_alloc(%zu, %zu)",
alignment, size);
@@ -71,7 +71,7 @@ TEST_BEGIN(test_oom_errors) {
#endif
set_errno(0);
p = aligned_alloc(alignment, size);
- assert_false(p != NULL || get_errno() != ENOMEM,
+ expect_false(p != NULL || get_errno() != ENOMEM,
"Expected error for aligned_alloc(%zu, %zu)",
alignment, size);
@@ -83,7 +83,7 @@ TEST_BEGIN(test_oom_errors) {
#endif
set_errno(0);
p = aligned_alloc(alignment, size);
- assert_false(p != NULL || get_errno() != ENOMEM,
+ expect_false(p != NULL || get_errno() != ENOMEM,
"Expected error for aligned_alloc(&p, %zu, %zu)",
alignment, size);
}
@@ -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);
}
diff --git a/test/integration/allocated.c b/test/integration/allocated.c
index 1425fd0aa12a..0c64272ce39d 100644
--- a/test/integration/allocated.c
+++ b/test/integration/allocated.c
@@ -32,7 +32,7 @@ thd_start(void *arg) {
test_fail("%s(): Error in mallctl(): %s", __func__,
strerror(err));
}
- assert_u64_eq(*ap0, a0,
+ expect_u64_eq(*ap0, a0,
"\"thread.allocatedp\" should provide a pointer to internal "
"storage");
@@ -53,25 +53,25 @@ thd_start(void *arg) {
test_fail("%s(): Error in mallctl(): %s", __func__,
strerror(err));
}
- assert_u64_eq(*dp0, d0,
+ expect_u64_eq(*dp0, d0,
"\"thread.deallocatedp\" should provide a pointer to internal "
"storage");
p = malloc(1);
- assert_ptr_not_null(p, "Unexpected malloc() error");
+ expect_ptr_not_null(p, "Unexpected malloc() error");
sz = sizeof(a1);
mallctl("thread.allocated", (void *)&a1, &sz, NULL, 0);
sz = sizeof(ap1);
mallctl("thread.allocatedp", (void *)&ap1, &sz, NULL, 0);
- assert_u64_eq(*ap1, a1,
+ expect_u64_eq(*ap1, a1,
"Dereferenced \"thread.allocatedp\" value should equal "
"\"thread.allocated\" value");
- assert_ptr_eq(ap0, ap1,
+ expect_ptr_eq(ap0, ap1,
"Pointer returned by \"thread.allocatedp\" should not change");
- usize = malloc_usable_size(p);
- assert_u64_le(a0 + usize, a1,
+ usize = TEST_MALLOC_SIZE(p);
+ expect_u64_le(a0 + usize, a1,
"Allocated memory counter should increase by at least the amount "
"explicitly allocated");
@@ -81,19 +81,19 @@ thd_start(void *arg) {
mallctl("thread.deallocated", (void *)&d1, &sz, NULL, 0);
sz = sizeof(dp1);
mallctl("thread.deallocatedp", (void *)&dp1, &sz, NULL, 0);
- assert_u64_eq(*dp1, d1,
+ expect_u64_eq(*dp1, d1,
"Dereferenced \"thread.deallocatedp\" value should equal "
"\"thread.deallocated\" value");
- assert_ptr_eq(dp0, dp1,
+ expect_ptr_eq(dp0, dp1,
"Pointer returned by \"thread.deallocatedp\" should not change");
- assert_u64_le(d0 + usize, d1,
+ expect_u64_le(d0 + usize, d1,
"Deallocated memory counter should increase by at least the amount "
"explicitly deallocated");
return NULL;
label_ENOENT:
- assert_false(config_stats,
+ expect_false(config_stats,
"ENOENT should only be returned if stats are disabled");
test_skip("\"thread.allocated\" mallctl not available");
return NULL;
diff --git a/test/integration/cpp/basic.cpp b/test/integration/cpp/basic.cpp
index 65890ecd556f..c1cf6cd87c60 100644
--- a/test/integration/cpp/basic.cpp
+++ b/test/integration/cpp/basic.cpp
@@ -1,16 +1,15 @@
-#include <memory>
#include "test/jemalloc_test.h"
TEST_BEGIN(test_basic) {
auto foo = new long(4);
- assert_ptr_not_null(foo, "Unexpected new[] failure");
+ expect_ptr_not_null(foo, "Unexpected new[] failure");
delete foo;
// Test nullptr handling.
foo = nullptr;
delete foo;
auto bar = new long;
- assert_ptr_not_null(bar, "Unexpected new failure");
+ expect_ptr_not_null(bar, "Unexpected new failure");
delete bar;
// Test nullptr handling.
bar = nullptr;
diff --git a/test/integration/cpp/infallible_new_false.cpp b/test/integration/cpp/infallible_new_false.cpp
new file mode 100644
index 000000000000..42196d6ad062
--- /dev/null
+++ b/test/integration/cpp/infallible_new_false.cpp
@@ -0,0 +1,23 @@
+#include <memory>
+
+#include "test/jemalloc_test.h"
+
+TEST_BEGIN(test_failing_alloc) {
+ bool saw_exception = false;
+ try {
+ /* Too big of an allocation to succeed. */
+ void *volatile ptr = ::operator new((size_t)-1);
+ (void)ptr;
+ } catch (...) {
+ saw_exception = true;
+ }
+ expect_true(saw_exception, "Didn't get a failure");
+}
+TEST_END
+
+int
+main(void) {
+ return test(
+ test_failing_alloc);
+}
+
diff --git a/test/integration/cpp/infallible_new_false.sh b/test/integration/cpp/infallible_new_false.sh
new file mode 100644
index 000000000000..7d41812ce3a4
--- /dev/null
+++ b/test/integration/cpp/infallible_new_false.sh
@@ -0,0 +1,8 @@
+#!/bin/sh
+
+XMALLOC_STR=""
+if [ "x${enable_xmalloc}" = "x1" ] ; then
+ XMALLOC_STR="xmalloc:false,"
+fi
+
+export MALLOC_CONF="${XMALLOC_STR}experimental_infallible_new:false"
diff --git a/test/integration/cpp/infallible_new_true.cpp b/test/integration/cpp/infallible_new_true.cpp
new file mode 100644
index 000000000000..d67541281074
--- /dev/null
+++ b/test/integration/cpp/infallible_new_true.cpp
@@ -0,0 +1,67 @@
+#include <stdio.h>
+
+#include "test/jemalloc_test.h"
+
+/*
+ * We can't test C++ in unit tests. In order to intercept abort, use a secret
+ * safety check abort hook in integration tests.
+ */
+typedef void (*abort_hook_t)(const char *message);
+bool fake_abort_called;
+void fake_abort(const char *message) {
+ if (strcmp(message, "<jemalloc>: Allocation failed and "
+ "opt.experimental_infallible_new is true. Aborting.\n") != 0) {
+ abort();
+ }
+ fake_abort_called = true;
+}
+
+static bool
+own_operator_new(void) {
+ uint64_t before, after;
+ size_t sz = sizeof(before);
+
+ /* thread.allocated is always available, even w/o config_stats. */
+ expect_d_eq(mallctl("thread.allocated", (void *)&before, &sz, NULL, 0),
+ 0, "Unexpected mallctl failure reading stats");
+ void *volatile ptr = ::operator new((size_t)8);
+ expect_ptr_not_null(ptr, "Unexpected allocation failure");
+ expect_d_eq(mallctl("thread.allocated", (void *)&after, &sz, NULL, 0),
+ 0, "Unexpected mallctl failure reading stats");
+
+ return (after != before);
+}
+
+TEST_BEGIN(test_failing_alloc) {
+ abort_hook_t abort_hook = &fake_abort;
+ expect_d_eq(mallctl("experimental.hooks.safety_check_abort", NULL, NULL,
+ (void *)&abort_hook, sizeof(abort_hook)), 0,
+ "Unexpected mallctl failure setting abort hook");
+
+ /*
+ * Not owning operator new is only expected to happen on MinGW which
+ * does not support operator new / delete replacement.
+ */
+#ifdef _WIN32
+ test_skip_if(!own_operator_new());
+#else
+ expect_true(own_operator_new(), "No operator new overload");
+#endif
+ void *volatile ptr = (void *)1;
+ try {
+ /* Too big of an allocation to succeed. */
+ ptr = ::operator new((size_t)-1);
+ } catch (...) {
+ abort();
+ }
+ expect_ptr_null(ptr, "Allocation should have failed");
+ expect_b_eq(fake_abort_called, true, "Abort hook not invoked");
+}
+TEST_END
+
+int
+main(void) {
+ return test(
+ test_failing_alloc);
+}
+
diff --git a/test/integration/cpp/infallible_new_true.sh b/test/integration/cpp/infallible_new_true.sh
new file mode 100644
index 000000000000..4a0ff542da7a
--- /dev/null
+++ b/test/integration/cpp/infallible_new_true.sh
@@ -0,0 +1,8 @@
+#!/bin/sh
+
+XMALLOC_STR=""
+if [ "x${enable_xmalloc}" = "x1" ] ; then
+ XMALLOC_STR="xmalloc:false,"
+fi
+
+export MALLOC_CONF="${XMALLOC_STR}experimental_infallible_new:true"
diff --git a/test/integration/extent.c b/test/integration/extent.c
index b5db0876658b..7a028f181ce1 100644
--- a/test/integration/extent.c
+++ b/test/integration/extent.c
@@ -2,17 +2,7 @@
#include "test/extent_hooks.h"
-static bool
-check_background_thread_enabled(void) {
- bool enabled;
- size_t sz = sizeof(bool);
- int ret = mallctl("background_thread", (void *)&enabled, &sz, NULL,0);
- if (ret == ENOENT) {
- return false;
- }
- assert_d_eq(ret, 0, "Unexpected mallctl error");
- return enabled;
-}
+#include "jemalloc/internal/arena_types.h"
static void
test_extent_body(unsigned arena_ind) {
@@ -27,16 +17,16 @@ test_extent_body(unsigned arena_ind) {
/* Get large size classes. */
sz = sizeof(size_t);
- assert_d_eq(mallctl("arenas.lextent.0.size", (void *)&large0, &sz, NULL,
+ expect_d_eq(mallctl("arenas.lextent.0.size", (void *)&large0, &sz, NULL,
0), 0, "Unexpected arenas.lextent.0.size failure");
- assert_d_eq(mallctl("arenas.lextent.1.size", (void *)&large1, &sz, NULL,
+ expect_d_eq(mallctl("arenas.lextent.1.size", (void *)&large1, &sz, NULL,
0), 0, "Unexpected arenas.lextent.1.size failure");
- assert_d_eq(mallctl("arenas.lextent.2.size", (void *)&large2, &sz, NULL,
+ expect_d_eq(mallctl("arenas.lextent.2.size", (void *)&large2, &sz, NULL,
0), 0, "Unexpected arenas.lextent.2.size failure");
/* Test dalloc/decommit/purge cascade. */
purge_miblen = sizeof(purge_mib)/sizeof(size_t);
- assert_d_eq(mallctlnametomib("arena.0.purge", purge_mib, &purge_miblen),
+ expect_d_eq(mallctlnametomib("arena.0.purge", purge_mib, &purge_miblen),
0, "Unexpected mallctlnametomib() failure");
purge_mib[1] = (size_t)arena_ind;
called_alloc = false;
@@ -44,23 +34,23 @@ test_extent_body(unsigned arena_ind) {
try_dalloc = false;
try_decommit = false;
p = mallocx(large0 * 2, flags);
- assert_ptr_not_null(p, "Unexpected mallocx() error");
- assert_true(called_alloc, "Expected alloc call");
+ expect_ptr_not_null(p, "Unexpected mallocx() error");
+ expect_true(called_alloc, "Expected alloc call");
called_dalloc = false;
called_decommit = false;
did_purge_lazy = false;
did_purge_forced = false;
called_split = false;
xallocx_success_a = (xallocx(p, large0, 0, flags) == large0);
- assert_d_eq(mallctlbymib(purge_mib, purge_miblen, NULL, NULL, NULL, 0),
+ expect_d_eq(mallctlbymib(purge_mib, purge_miblen, NULL, NULL, NULL, 0),
0, "Unexpected arena.%u.purge error", arena_ind);
if (xallocx_success_a) {
- assert_true(called_dalloc, "Expected dalloc call");
- assert_true(called_decommit, "Expected decommit call");
- assert_true(did_purge_lazy || did_purge_forced,
+ expect_true(called_dalloc, "Expected dalloc call");
+ expect_true(called_decommit, "Expected decommit call");
+ expect_true(did_purge_lazy || did_purge_forced,
"Expected purge");
+ expect_true(called_split, "Expected split call");
}
- assert_true(called_split, "Expected split call");
dallocx(p, flags);
try_dalloc = true;
@@ -68,25 +58,25 @@ test_extent_body(unsigned arena_ind) {
try_dalloc = false;
try_decommit = true;
p = mallocx(large0 * 2, flags);
- assert_ptr_not_null(p, "Unexpected mallocx() error");
+ expect_ptr_not_null(p, "Unexpected mallocx() error");
did_decommit = false;
did_commit = false;
called_split = false;
did_split = false;
did_merge = false;
xallocx_success_b = (xallocx(p, large0, 0, flags) == large0);
- assert_d_eq(mallctlbymib(purge_mib, purge_miblen, NULL, NULL, NULL, 0),
+ expect_d_eq(mallctlbymib(purge_mib, purge_miblen, NULL, NULL, NULL, 0),
0, "Unexpected arena.%u.purge error", arena_ind);
if (xallocx_success_b) {
- assert_true(did_split, "Expected split");
+ expect_true(did_split, "Expected split");
}
xallocx_success_c = (xallocx(p, large0 * 2, 0, flags) == large0 * 2);
if (did_split) {
- assert_b_eq(did_decommit, did_commit,
+ expect_b_eq(did_decommit, did_commit,
"Expected decommit/commit match");
}
if (xallocx_success_b && xallocx_success_c) {
- assert_true(did_merge, "Expected merge");
+ expect_true(did_merge, "Expected merge");
}
dallocx(p, flags);
try_dalloc = true;
@@ -94,7 +84,7 @@ test_extent_body(unsigned arena_ind) {
/* Make sure non-large allocation succeeds. */
p = mallocx(42, flags);
- assert_ptr_not_null(p, "Unexpected mallocx() error");
+ expect_ptr_not_null(p, "Unexpected mallocx() error");
dallocx(p, flags);
}
@@ -110,7 +100,7 @@ test_manual_hook_auto_arena(void) {
sz = sizeof(unsigned);
/* Get number of auto arenas. */
- assert_d_eq(mallctl("opt.narenas", (void *)&narenas, &sz, NULL, 0),
+ expect_d_eq(mallctl("opt.narenas", (void *)&narenas, &sz, NULL, 0),
0, "Unexpected mallctl() failure");
if (narenas == 1) {
return;
@@ -118,18 +108,18 @@ test_manual_hook_auto_arena(void) {
/* Install custom extent hooks on arena 1 (might not be initialized). */
hooks_miblen = sizeof(hooks_mib)/sizeof(size_t);
- assert_d_eq(mallctlnametomib("arena.0.extent_hooks", hooks_mib,
+ expect_d_eq(mallctlnametomib("arena.0.extent_hooks", hooks_mib,
&hooks_miblen), 0, "Unexpected mallctlnametomib() failure");
hooks_mib[1] = 1;
old_size = sizeof(extent_hooks_t *);
new_hooks = &hooks;
new_size = sizeof(extent_hooks_t *);
- assert_d_eq(mallctlbymib(hooks_mib, hooks_miblen, (void *)&old_hooks,
+ expect_d_eq(mallctlbymib(hooks_mib, hooks_miblen, (void *)&old_hooks,
&old_size, (void *)&new_hooks, new_size), 0,
"Unexpected extent_hooks error");
static bool auto_arena_created = false;
if (old_hooks != &hooks) {
- assert_b_eq(auto_arena_created, false,
+ expect_b_eq(auto_arena_created, false,
"Expected auto arena 1 created only once.");
auto_arena_created = true;
}
@@ -146,62 +136,62 @@ test_manual_hook_body(void) {
extent_hooks_prep();
sz = sizeof(unsigned);
- assert_d_eq(mallctl("arenas.create", (void *)&arena_ind, &sz, NULL, 0),
+ expect_d_eq(mallctl("arenas.create", (void *)&arena_ind, &sz, NULL, 0),
0, "Unexpected mallctl() failure");
/* Install custom extent hooks. */
hooks_miblen = sizeof(hooks_mib)/sizeof(size_t);
- assert_d_eq(mallctlnametomib("arena.0.extent_hooks", hooks_mib,
+ expect_d_eq(mallctlnametomib("arena.0.extent_hooks", hooks_mib,
&hooks_miblen), 0, "Unexpected mallctlnametomib() failure");
hooks_mib[1] = (size_t)arena_ind;
old_size = sizeof(extent_hooks_t *);
new_hooks = &hooks;
new_size = sizeof(extent_hooks_t *);
- assert_d_eq(mallctlbymib(hooks_mib, hooks_miblen, (void *)&old_hooks,
+ expect_d_eq(mallctlbymib(hooks_mib, hooks_miblen, (void *)&old_hooks,
&old_size, (void *)&new_hooks, new_size), 0,
"Unexpected extent_hooks error");
- assert_ptr_ne(old_hooks->alloc, extent_alloc_hook,
+ expect_ptr_ne(old_hooks->alloc, extent_alloc_hook,
"Unexpected extent_hooks error");
- assert_ptr_ne(old_hooks->dalloc, extent_dalloc_hook,
+ expect_ptr_ne(old_hooks->dalloc, extent_dalloc_hook,
"Unexpected extent_hooks error");
- assert_ptr_ne(old_hooks->commit, extent_commit_hook,
+ expect_ptr_ne(old_hooks->commit, extent_commit_hook,
"Unexpected extent_hooks error");
- assert_ptr_ne(old_hooks->decommit, extent_decommit_hook,
+ expect_ptr_ne(old_hooks->decommit, extent_decommit_hook,
"Unexpected extent_hooks error");
- assert_ptr_ne(old_hooks->purge_lazy, extent_purge_lazy_hook,
+ expect_ptr_ne(old_hooks->purge_lazy, extent_purge_lazy_hook,
"Unexpected extent_hooks error");
- assert_ptr_ne(old_hooks->purge_forced, extent_purge_forced_hook,
+ expect_ptr_ne(old_hooks->purge_forced, extent_purge_forced_hook,
"Unexpected extent_hooks error");
- assert_ptr_ne(old_hooks->split, extent_split_hook,
+ expect_ptr_ne(old_hooks->split, extent_split_hook,
"Unexpected extent_hooks error");
- assert_ptr_ne(old_hooks->merge, extent_merge_hook,
+ expect_ptr_ne(old_hooks->merge, extent_merge_hook,
"Unexpected extent_hooks error");
- if (!check_background_thread_enabled()) {
+ if (!is_background_thread_enabled()) {
test_extent_body(arena_ind);
}
/* Restore extent hooks. */
- assert_d_eq(mallctlbymib(hooks_mib, hooks_miblen, NULL, NULL,
+ expect_d_eq(mallctlbymib(hooks_mib, hooks_miblen, NULL, NULL,
(void *)&old_hooks, new_size), 0, "Unexpected extent_hooks error");
- assert_d_eq(mallctlbymib(hooks_mib, hooks_miblen, (void *)&old_hooks,
+ expect_d_eq(mallctlbymib(hooks_mib, hooks_miblen, (void *)&old_hooks,
&old_size, NULL, 0), 0, "Unexpected extent_hooks error");
- assert_ptr_eq(old_hooks, default_hooks, "Unexpected extent_hooks error");
- assert_ptr_eq(old_hooks->alloc, default_hooks->alloc,
+ expect_ptr_eq(old_hooks, default_hooks, "Unexpected extent_hooks error");
+ expect_ptr_eq(old_hooks->alloc, default_hooks->alloc,
"Unexpected extent_hooks error");
- assert_ptr_eq(old_hooks->dalloc, default_hooks->dalloc,
+ expect_ptr_eq(old_hooks->dalloc, default_hooks->dalloc,
"Unexpected extent_hooks error");
- assert_ptr_eq(old_hooks->commit, default_hooks->commit,
+ expect_ptr_eq(old_hooks->commit, default_hooks->commit,
"Unexpected extent_hooks error");
- assert_ptr_eq(old_hooks->decommit, default_hooks->decommit,
+ expect_ptr_eq(old_hooks->decommit, default_hooks->decommit,
"Unexpected extent_hooks error");
- assert_ptr_eq(old_hooks->purge_lazy, default_hooks->purge_lazy,
+ expect_ptr_eq(old_hooks->purge_lazy, default_hooks->purge_lazy,
"Unexpected extent_hooks error");
- assert_ptr_eq(old_hooks->purge_forced, default_hooks->purge_forced,
+ expect_ptr_eq(old_hooks->purge_forced, default_hooks->purge_forced,
"Unexpected extent_hooks error");
- assert_ptr_eq(old_hooks->split, default_hooks->split,
+ expect_ptr_eq(old_hooks->split, default_hooks->split,
"Unexpected extent_hooks error");
- assert_ptr_eq(old_hooks->merge, default_hooks->merge,
+ expect_ptr_eq(old_hooks->merge, default_hooks->merge,
"Unexpected extent_hooks error");
}
@@ -232,17 +222,66 @@ TEST_BEGIN(test_extent_auto_hook) {
sz = sizeof(unsigned);
new_hooks = &hooks;
new_size = sizeof(extent_hooks_t *);
- assert_d_eq(mallctl("arenas.create", (void *)&arena_ind, &sz,
+ expect_d_eq(mallctl("arenas.create", (void *)&arena_ind, &sz,
(void *)&new_hooks, new_size), 0, "Unexpected mallctl() failure");
- test_skip_if(check_background_thread_enabled());
+ test_skip_if(is_background_thread_enabled());
test_extent_body(arena_ind);
}
TEST_END
+static void
+test_arenas_create_ext_base(arena_config_t config,
+ bool expect_hook_data, bool expect_hook_metadata)
+{
+ unsigned arena, arena1;
+ void *ptr;
+ size_t sz = sizeof(unsigned);
+
+ extent_hooks_prep();
+
+ called_alloc = false;
+ expect_d_eq(mallctl("experimental.arenas_create_ext",
+ (void *)&arena, &sz, &config, sizeof(arena_config_t)), 0,
+ "Unexpected mallctl() failure");
+ expect_b_eq(called_alloc, expect_hook_metadata,
+ "expected hook metadata alloc mismatch");
+
+ called_alloc = false;
+ ptr = mallocx(42, MALLOCX_ARENA(arena) | MALLOCX_TCACHE_NONE);
+ expect_b_eq(called_alloc, expect_hook_data,
+ "expected hook data alloc mismatch");
+
+ expect_ptr_not_null(ptr, "Unexpected mallocx() failure");
+ expect_d_eq(mallctl("arenas.lookup", &arena1, &sz, &ptr, sizeof(ptr)),
+ 0, "Unexpected mallctl() failure");
+ expect_u_eq(arena, arena1, "Unexpected arena index");
+ dallocx(ptr, 0);
+}
+
+TEST_BEGIN(test_arenas_create_ext_with_ehooks_no_metadata) {
+ arena_config_t config;
+ config.extent_hooks = &hooks;
+ config.metadata_use_hooks = false;
+
+ test_arenas_create_ext_base(config, true, false);
+}
+TEST_END
+
+TEST_BEGIN(test_arenas_create_ext_with_ehooks_with_metadata) {
+ arena_config_t config;
+ config.extent_hooks = &hooks;
+ config.metadata_use_hooks = true;
+
+ test_arenas_create_ext_base(config, true, true);
+}
+TEST_END
+
int
main(void) {
return test(
test_extent_manual_hook,
- test_extent_auto_hook);
+ test_extent_auto_hook,
+ test_arenas_create_ext_with_ehooks_no_metadata,
+ test_arenas_create_ext_with_ehooks_with_metadata);
}
diff --git a/test/integration/malloc.c b/test/integration/malloc.c
index 8b33bc8f3b59..ef4491636dd9 100644
--- a/test/integration/malloc.c
+++ b/test/integration/malloc.c
@@ -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);
}
diff --git a/test/integration/mallocx.c b/test/integration/mallocx.c
index 645d4db48ff8..fdf1e3f43bd8 100644
--- a/test/integration/mallocx.c
+++ b/test/integration/mallocx.c
@@ -6,7 +6,7 @@ get_nsizes_impl(const char *cmd) {
size_t z;
z = sizeof(unsigned);
- assert_d_eq(mallctl(cmd, (void *)&ret, &z, NULL, 0), 0,
+ expect_d_eq(mallctl(cmd, (void *)&ret, &z, NULL, 0), 0,
"Unexpected mallctl(\"%s\", ...) failure", cmd);
return ret;
@@ -25,11 +25,11 @@ get_size_impl(const char *cmd, size_t ind) {
size_t miblen = 4;
z = sizeof(size_t);
- assert_d_eq(mallctlnametomib(cmd, mib, &miblen),
+ expect_d_eq(mallctlnametomib(cmd, mib, &miblen),
0, "Unexpected mallctlnametomib(\"%s\", ...) failure", cmd);
mib[2] = ind;
z = sizeof(size_t);
- assert_d_eq(mallctlbymib(mib, miblen, (void *)&ret, &z, NULL, 0),
+ expect_d_eq(mallctlbymib(mib, miblen, (void *)&ret, &z, NULL, 0),
0, "Unexpected mallctlbymib([\"%s\", %zu], ...) failure", cmd, ind);
return ret;
@@ -47,7 +47,7 @@ get_large_size(size_t ind) {
*/
static void
purge(void) {
- assert_d_eq(mallctl("arena.0.purge", NULL, NULL, NULL, 0), 0,
+ expect_d_eq(mallctl("arena.0.purge", NULL, NULL, NULL, 0), 0,
"Unexpected mallctl error");
}
@@ -66,16 +66,16 @@ TEST_BEGIN(test_overflow) {
largemax = get_large_size(get_nlarge()-1);
- assert_ptr_null(mallocx(largemax+1, 0),
+ expect_ptr_null(mallocx(largemax+1, 0),
"Expected OOM for mallocx(size=%#zx, 0)", largemax+1);
- assert_ptr_null(mallocx(ZU(PTRDIFF_MAX)+1, 0),
+ expect_ptr_null(mallocx(ZU(PTRDIFF_MAX)+1, 0),
"Expected OOM for mallocx(size=%#zx, 0)", ZU(PTRDIFF_MAX)+1);
- assert_ptr_null(mallocx(SIZE_T_MAX, 0),
+ expect_ptr_null(mallocx(SIZE_T_MAX, 0),
"Expected OOM for mallocx(size=%#zx, 0)", SIZE_T_MAX);
- assert_ptr_null(mallocx(1, MALLOCX_ALIGN(ZU(PTRDIFF_MAX)+1)),
+ expect_ptr_null(mallocx(1, MALLOCX_ALIGN(ZU(PTRDIFF_MAX)+1)),
"Expected OOM for mallocx(size=1, MALLOCX_ALIGN(%#zx))",
ZU(PTRDIFF_MAX)+1);
}
@@ -85,11 +85,11 @@ static void *
remote_alloc(void *arg) {
unsigned arena;
size_t sz = sizeof(unsigned);
- assert_d_eq(mallctl("arenas.create", (void *)&arena, &sz, NULL, 0), 0,
+ expect_d_eq(mallctl("arenas.create", (void *)&arena, &sz, NULL, 0), 0,
"Unexpected mallctl() failure");
size_t large_sz;
sz = sizeof(size_t);
- assert_d_eq(mallctl("arenas.lextent.0.size", (void *)&large_sz, &sz,
+ expect_d_eq(mallctl("arenas.lextent.0.size", (void *)&large_sz, &sz,
NULL, 0), 0, "Unexpected mallctl failure");
void *ptr = mallocx(large_sz, MALLOCX_ARENA(arena)
@@ -105,7 +105,7 @@ TEST_BEGIN(test_remote_free) {
void *ret;
thd_create(&thd, remote_alloc, (void *)&ret);
thd_join(thd, NULL);
- assert_ptr_not_null(ret, "Unexpected mallocx failure");
+ expect_ptr_not_null(ret, "Unexpected mallocx failure");
/* Avoid TCACHE_NONE to explicitly test tcache_flush(). */
dallocx(ret, 0);
@@ -131,7 +131,7 @@ TEST_BEGIN(test_oom) {
oom = true;
}
}
- assert_true(oom,
+ expect_true(oom,
"Expected OOM during series of calls to mallocx(size=%zu, 0)",
largemax);
for (i = 0; i < sizeof(ptrs) / sizeof(void *); i++) {
@@ -142,14 +142,14 @@ TEST_BEGIN(test_oom) {
purge();
#if LG_SIZEOF_PTR == 3
- assert_ptr_null(mallocx(0x8000000000000000ULL,
+ expect_ptr_null(mallocx(0x8000000000000000ULL,
MALLOCX_ALIGN(0x8000000000000000ULL)),
"Expected OOM for mallocx()");
- assert_ptr_null(mallocx(0x8000000000000000ULL,
+ expect_ptr_null(mallocx(0x8000000000000000ULL,
MALLOCX_ALIGN(0x80000000)),
"Expected OOM for mallocx()");
#else
- assert_ptr_null(mallocx(0x80000000UL, MALLOCX_ALIGN(0x80000000UL)),
+ expect_ptr_null(mallocx(0x80000000UL, MALLOCX_ALIGN(0x80000000UL)),
"Expected OOM for mallocx()");
#endif
}
@@ -166,28 +166,28 @@ TEST_BEGIN(test_basic) {
size_t nsz, rsz;
void *p;
nsz = nallocx(sz, 0);
- assert_zu_ne(nsz, 0, "Unexpected nallocx() error");
+ expect_zu_ne(nsz, 0, "Unexpected nallocx() error");
p = mallocx(sz, 0);
- assert_ptr_not_null(p,
+ expect_ptr_not_null(p,
"Unexpected mallocx(size=%zx, flags=0) error", sz);
rsz = sallocx(p, 0);
- assert_zu_ge(rsz, sz, "Real size smaller than expected");
- assert_zu_eq(nsz, rsz, "nallocx()/sallocx() size mismatch");
+ expect_zu_ge(rsz, sz, "Real size smaller than expected");
+ expect_zu_eq(nsz, rsz, "nallocx()/sallocx() size mismatch");
dallocx(p, 0);
p = mallocx(sz, 0);
- assert_ptr_not_null(p,
+ expect_ptr_not_null(p,
"Unexpected mallocx(size=%zx, flags=0) error", sz);
dallocx(p, 0);
nsz = nallocx(sz, MALLOCX_ZERO);
- assert_zu_ne(nsz, 0, "Unexpected nallocx() error");
+ expect_zu_ne(nsz, 0, "Unexpected nallocx() error");
p = mallocx(sz, MALLOCX_ZERO);
- assert_ptr_not_null(p,
+ expect_ptr_not_null(p,
"Unexpected mallocx(size=%zx, flags=MALLOCX_ZERO) error",
nsz);
rsz = sallocx(p, 0);
- assert_zu_eq(nsz, rsz, "nallocx()/sallocx() rsize mismatch");
+ expect_zu_eq(nsz, rsz, "nallocx()/sallocx() rsize mismatch");
dallocx(p, 0);
purge();
}
@@ -224,22 +224,22 @@ TEST_BEGIN(test_alignment_and_size) {
for (i = 0; i < NITER; i++) {
nsz = nallocx(sz, MALLOCX_ALIGN(alignment) |
MALLOCX_ZERO | MALLOCX_ARENA(0));
- assert_zu_ne(nsz, 0,
+ expect_zu_ne(nsz, 0,
"nallocx() error for alignment=%zu, "
"size=%zu (%#zx)", alignment, sz, sz);
ps[i] = mallocx(sz, MALLOCX_ALIGN(alignment) |
MALLOCX_ZERO | MALLOCX_ARENA(0));
- assert_ptr_not_null(ps[i],
+ expect_ptr_not_null(ps[i],
"mallocx() error for alignment=%zu, "
"size=%zu (%#zx)", alignment, sz, sz);
rsz = sallocx(ps[i], 0);
- assert_zu_ge(rsz, sz,
+ expect_zu_ge(rsz, sz,
"Real size smaller than expected for "
"alignment=%zu, size=%zu", alignment, sz);
- assert_zu_eq(nsz, rsz,
+ expect_zu_eq(nsz, rsz,
"nallocx()/sallocx() size mismatch for "
"alignment=%zu, size=%zu", alignment, sz);
- assert_ptr_null(
+ expect_ptr_null(
(void *)((uintptr_t)ps[i] & (alignment-1)),
"%p inadequately aligned for"
" alignment=%zu, size=%zu", ps[i],
diff --git a/test/integration/overflow.c b/test/integration/overflow.c
index 748ebb677205..ce63327ca3b5 100644
--- a/test/integration/overflow.c
+++ b/test/integration/overflow.c
@@ -17,33 +17,33 @@ TEST_BEGIN(test_overflow) {
void *p;
sz = sizeof(unsigned);
- assert_d_eq(mallctl("arenas.nlextents", (void *)&nlextents, &sz, NULL,
+ expect_d_eq(mallctl("arenas.nlextents", (void *)&nlextents, &sz, NULL,
0), 0, "Unexpected mallctl() error");
miblen = sizeof(mib) / sizeof(size_t);
- assert_d_eq(mallctlnametomib("arenas.lextent.0.size", mib, &miblen), 0,
+ expect_d_eq(mallctlnametomib("arenas.lextent.0.size", mib, &miblen), 0,
"Unexpected mallctlnametomib() error");
mib[2] = nlextents - 1;
sz = sizeof(size_t);
- assert_d_eq(mallctlbymib(mib, miblen, (void *)&max_size_class, &sz,
+ expect_d_eq(mallctlbymib(mib, miblen, (void *)&max_size_class, &sz,
NULL, 0), 0, "Unexpected mallctlbymib() error");
- assert_ptr_null(malloc(max_size_class + 1),
+ expect_ptr_null(malloc(max_size_class + 1),
"Expected OOM due to over-sized allocation request");
- assert_ptr_null(malloc(SIZE_T_MAX),
+ expect_ptr_null(malloc(SIZE_T_MAX),
"Expected OOM due to over-sized allocation request");
- assert_ptr_null(calloc(1, max_size_class + 1),
+ expect_ptr_null(calloc(1, max_size_class + 1),
"Expected OOM due to over-sized allocation request");
- assert_ptr_null(calloc(1, SIZE_T_MAX),
+ expect_ptr_null(calloc(1, SIZE_T_MAX),
"Expected OOM due to over-sized allocation request");
p = malloc(1);
- assert_ptr_not_null(p, "Unexpected malloc() OOM");
- assert_ptr_null(realloc(p, max_size_class + 1),
+ expect_ptr_not_null(p, "Unexpected malloc() OOM");
+ expect_ptr_null(realloc(p, max_size_class + 1),
"Expected OOM due to over-sized allocation request");
- assert_ptr_null(realloc(p, SIZE_T_MAX),
+ expect_ptr_null(realloc(p, SIZE_T_MAX),
"Expected OOM due to over-sized allocation request");
free(p);
}
diff --git a/test/integration/posix_memalign.c b/test/integration/posix_memalign.c
index d992260a2dd9..2da0549bfa11 100644
--- a/test/integration/posix_memalign.c
+++ b/test/integration/posix_memalign.c
@@ -9,7 +9,7 @@
*/
static void
purge(void) {
- assert_d_eq(mallctl("arena.0.purge", NULL, NULL, NULL, 0), 0,
+ expect_d_eq(mallctl("arena.0.purge", NULL, NULL, NULL, 0), 0,
"Unexpected mallctl error");
}
@@ -18,14 +18,14 @@ TEST_BEGIN(test_alignment_errors) {
void *p;
for (alignment = 0; alignment < sizeof(void *); alignment++) {
- assert_d_eq(posix_memalign(&p, alignment, 1), EINVAL,
+ expect_d_eq(posix_memalign(&p, alignment, 1), EINVAL,
"Expected error for invalid alignment %zu",
alignment);
}
for (alignment = sizeof(size_t); alignment < MAXALIGN;
alignment <<= 1) {
- assert_d_ne(posix_memalign(&p, alignment + 1, 1), 0,
+ expect_d_ne(posix_memalign(&p, alignment + 1, 1), 0,
"Expected error for invalid alignment %zu",
alignment + 1);
}
@@ -43,7 +43,7 @@ TEST_BEGIN(test_oom_errors) {
alignment = 0x80000000LU;
size = 0x80000000LU;
#endif
- assert_d_ne(posix_memalign(&p, alignment, size), 0,
+ expect_d_ne(posix_memalign(&p, alignment, size), 0,
"Expected error for posix_memalign(&p, %zu, %zu)",
alignment, size);
@@ -54,7 +54,7 @@ TEST_BEGIN(test_oom_errors) {
alignment = 0x40000000LU;
size = 0xc0000001LU;
#endif
- assert_d_ne(posix_memalign(&p, alignment, size), 0,
+ expect_d_ne(posix_memalign(&p, alignment, size), 0,
"Expected error for posix_memalign(&p, %zu, %zu)",
alignment, size);
@@ -64,7 +64,7 @@ TEST_BEGIN(test_oom_errors) {
#else
size = 0xfffffff0LU;
#endif
- assert_d_ne(posix_memalign(&p, alignment, size), 0,
+ expect_d_ne(posix_memalign(&p, alignment, size), 0,
"Expected error for posix_memalign(&p, %zu, %zu)",
alignment, size);
}
@@ -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;
}
diff --git a/test/integration/rallocx.c b/test/integration/rallocx.c
index 08ed08d3fb7b..68b8f3816540 100644
--- a/test/integration/rallocx.c
+++ b/test/integration/rallocx.c
@@ -6,7 +6,7 @@ get_nsizes_impl(const char *cmd) {
size_t z;
z = sizeof(unsigned);
- assert_d_eq(mallctl(cmd, (void *)&ret, &z, NULL, 0), 0,
+ expect_d_eq(mallctl(cmd, (void *)&ret, &z, NULL, 0), 0,
"Unexpected mallctl(\"%s\", ...) failure", cmd);
return ret;
@@ -25,11 +25,11 @@ get_size_impl(const char *cmd, size_t ind) {
size_t miblen = 4;
z = sizeof(size_t);
- assert_d_eq(mallctlnametomib(cmd, mib, &miblen),
+ expect_d_eq(mallctlnametomib(cmd, mib, &miblen),
0, "Unexpected mallctlnametomib(\"%s\", ...) failure", cmd);
mib[2] = ind;
z = sizeof(size_t);
- assert_d_eq(mallctlbymib(mib, miblen, (void *)&ret, &z, NULL, 0),
+ expect_d_eq(mallctlbymib(mib, miblen, (void *)&ret, &z, NULL, 0),
0, "Unexpected mallctlbymib([\"%s\", %zu], ...) failure", cmd, ind);
return ret;
@@ -41,7 +41,11 @@ get_large_size(size_t ind) {
}
TEST_BEGIN(test_grow_and_shrink) {
- void *p, *q;
+ /*
+ * Use volatile to workaround buffer overflow false positives
+ * (-D_FORTIFY_SOURCE=3).
+ */
+ void *volatile p, *volatile q;
size_t tsz;
#define NCYCLES 3
unsigned i, j;
@@ -50,28 +54,28 @@ TEST_BEGIN(test_grow_and_shrink) {
#define MAXSZ ZU(12 * 1024 * 1024)
p = mallocx(1, 0);
- assert_ptr_not_null(p, "Unexpected mallocx() error");
+ expect_ptr_not_null(p, "Unexpected mallocx() error");
szs[0] = sallocx(p, 0);
for (i = 0; i < NCYCLES; i++) {
for (j = 1; j < NSZS && szs[j-1] < MAXSZ; j++) {
q = rallocx(p, szs[j-1]+1, 0);
- assert_ptr_not_null(q,
+ expect_ptr_not_null(q,
"Unexpected rallocx() error for size=%zu-->%zu",
szs[j-1], szs[j-1]+1);
szs[j] = sallocx(q, 0);
- assert_zu_ne(szs[j], szs[j-1]+1,
+ expect_zu_ne(szs[j], szs[j-1]+1,
"Expected size to be at least: %zu", szs[j-1]+1);
p = q;
}
for (j--; j > 0; j--) {
q = rallocx(p, szs[j-1], 0);
- assert_ptr_not_null(q,
+ expect_ptr_not_null(q,
"Unexpected rallocx() error for size=%zu-->%zu",
szs[j], szs[j-1]);
tsz = sallocx(q, 0);
- assert_zu_eq(tsz, szs[j-1],
+ expect_zu_eq(tsz, szs[j-1],
"Expected size=%zu, got size=%zu", szs[j-1], tsz);
p = q;
}
@@ -85,9 +89,13 @@ TEST_BEGIN(test_grow_and_shrink) {
TEST_END
static bool
-validate_fill(const void *p, uint8_t c, size_t offset, size_t len) {
+validate_fill(void *p, uint8_t c, size_t offset, size_t len) {
bool ret = false;
- const uint8_t *buf = (const uint8_t *)p;
+ /*
+ * Use volatile to workaround buffer overflow false positives
+ * (-D_FORTIFY_SOURCE=3).
+ */
+ uint8_t *volatile buf = (uint8_t *)p;
size_t i;
for (i = 0; i < len; i++) {
@@ -104,7 +112,11 @@ validate_fill(const void *p, uint8_t c, size_t offset, size_t len) {
}
TEST_BEGIN(test_zero) {
- void *p, *q;
+ /*
+ * Use volatile to workaround buffer overflow false positives
+ * (-D_FORTIFY_SOURCE=3).
+ */
+ void *volatile p, *volatile q;
size_t psz, qsz, i, j;
size_t start_sizes[] = {1, 3*1024, 63*1024, 4095*1024};
#define FILL_BYTE 0xaaU
@@ -113,23 +125,23 @@ TEST_BEGIN(test_zero) {
for (i = 0; i < sizeof(start_sizes)/sizeof(size_t); i++) {
size_t start_size = start_sizes[i];
p = mallocx(start_size, MALLOCX_ZERO);
- assert_ptr_not_null(p, "Unexpected mallocx() error");
+ expect_ptr_not_null(p, "Unexpected mallocx() error");
psz = sallocx(p, 0);
- assert_false(validate_fill(p, 0, 0, psz),
+ expect_false(validate_fill(p, 0, 0, psz),
"Expected zeroed memory");
memset(p, FILL_BYTE, psz);
- assert_false(validate_fill(p, FILL_BYTE, 0, psz),
+ expect_false(validate_fill(p, FILL_BYTE, 0, psz),
"Expected filled memory");
for (j = 1; j < RANGE; j++) {
q = rallocx(p, start_size+j, MALLOCX_ZERO);
- assert_ptr_not_null(q, "Unexpected rallocx() error");
+ expect_ptr_not_null(q, "Unexpected rallocx() error");
qsz = sallocx(q, 0);
if (q != p || qsz != psz) {
- assert_false(validate_fill(q, FILL_BYTE, 0,
+ expect_false(validate_fill(q, FILL_BYTE, 0,
psz), "Expected filled memory");
- assert_false(validate_fill(q, 0, psz, qsz-psz),
+ expect_false(validate_fill(q, 0, psz, qsz-psz),
"Expected zeroed memory");
}
if (psz != qsz) {
@@ -139,7 +151,7 @@ TEST_BEGIN(test_zero) {
}
p = q;
}
- assert_false(validate_fill(p, FILL_BYTE, 0, psz),
+ expect_false(validate_fill(p, FILL_BYTE, 0, psz),
"Expected filled memory");
dallocx(p, 0);
}
@@ -154,13 +166,13 @@ TEST_BEGIN(test_align) {
align = ZU(1);
p = mallocx(1, MALLOCX_ALIGN(align));
- assert_ptr_not_null(p, "Unexpected mallocx() error");
+ expect_ptr_not_null(p, "Unexpected mallocx() error");
for (align <<= 1; align <= MAX_ALIGN; align <<= 1) {
q = rallocx(p, 1, MALLOCX_ALIGN(align));
- assert_ptr_not_null(q,
+ expect_ptr_not_null(q,
"Unexpected rallocx() error for align=%zu", align);
- assert_ptr_null(
+ expect_ptr_null(
(void *)((uintptr_t)q & (align-1)),
"%p inadequately aligned for align=%zu",
q, align);
@@ -171,8 +183,45 @@ TEST_BEGIN(test_align) {
}
TEST_END
+TEST_BEGIN(test_align_enum) {
+/* Span both small sizes and large sizes. */
+#define LG_MIN 12
+#define LG_MAX 15
+ for (size_t lg_align = LG_MIN; lg_align <= LG_MAX; ++lg_align) {
+ for (size_t lg_size = LG_MIN; lg_size <= LG_MAX; ++lg_size) {
+ size_t size = 1 << lg_size;
+ for (size_t lg_align_next = LG_MIN;
+ lg_align_next <= LG_MAX; ++lg_align_next) {
+ int flags = MALLOCX_LG_ALIGN(lg_align);
+ void *p = mallocx(1, flags);
+ assert_ptr_not_null(p,
+ "Unexpected mallocx() error");
+ assert_zu_eq(nallocx(1, flags),
+ TEST_MALLOC_SIZE(p),
+ "Wrong mallocx() usable size");
+ int flags_next =
+ MALLOCX_LG_ALIGN(lg_align_next);
+ p = rallocx(p, size, flags_next);
+ assert_ptr_not_null(p,
+ "Unexpected rallocx() error");
+ expect_zu_eq(nallocx(size, flags_next),
+ TEST_MALLOC_SIZE(p),
+ "Wrong rallocx() usable size");
+ free(p);
+ }
+ }
+ }
+#undef LG_MAX
+#undef LG_MIN
+}
+TEST_END
+
TEST_BEGIN(test_lg_align_and_zero) {
- void *p, *q;
+ /*
+ * Use volatile to workaround buffer overflow false positives
+ * (-D_FORTIFY_SOURCE=3).
+ */
+ void *volatile p, *volatile q;
unsigned lg_align;
size_t sz;
#define MAX_LG_ALIGN 25
@@ -180,23 +229,23 @@ TEST_BEGIN(test_lg_align_and_zero) {
lg_align = 0;
p = mallocx(1, MALLOCX_LG_ALIGN(lg_align)|MALLOCX_ZERO);
- assert_ptr_not_null(p, "Unexpected mallocx() error");
+ expect_ptr_not_null(p, "Unexpected mallocx() error");
for (lg_align++; lg_align <= MAX_LG_ALIGN; lg_align++) {
q = rallocx(p, 1, MALLOCX_LG_ALIGN(lg_align)|MALLOCX_ZERO);
- assert_ptr_not_null(q,
+ expect_ptr_not_null(q,
"Unexpected rallocx() error for lg_align=%u", lg_align);
- assert_ptr_null(
+ expect_ptr_null(
(void *)((uintptr_t)q & ((ZU(1) << lg_align)-1)),
"%p inadequately aligned for lg_align=%u", q, lg_align);
sz = sallocx(q, 0);
if ((sz << 1) <= MAX_VALIDATE) {
- assert_false(validate_fill(q, 0, 0, sz),
+ expect_false(validate_fill(q, 0, 0, sz),
"Expected zeroed memory");
} else {
- assert_false(validate_fill(q, 0, 0, MAX_VALIDATE),
+ expect_false(validate_fill(q, 0, 0, MAX_VALIDATE),
"Expected zeroed memory");
- assert_false(validate_fill(
+ expect_false(validate_fill(
(void *)((uintptr_t)q+sz-MAX_VALIDATE),
0, 0, MAX_VALIDATE), "Expected zeroed memory");
}
@@ -225,18 +274,18 @@ TEST_BEGIN(test_overflow) {
largemax = get_large_size(get_nlarge()-1);
p = mallocx(1, 0);
- assert_ptr_not_null(p, "Unexpected mallocx() failure");
+ expect_ptr_not_null(p, "Unexpected mallocx() failure");
- assert_ptr_null(rallocx(p, largemax+1, 0),
+ expect_ptr_null(rallocx(p, largemax+1, 0),
"Expected OOM for rallocx(p, size=%#zx, 0)", largemax+1);
- assert_ptr_null(rallocx(p, ZU(PTRDIFF_MAX)+1, 0),
+ expect_ptr_null(rallocx(p, ZU(PTRDIFF_MAX)+1, 0),
"Expected OOM for rallocx(p, size=%#zx, 0)", ZU(PTRDIFF_MAX)+1);
- assert_ptr_null(rallocx(p, SIZE_T_MAX, 0),
+ expect_ptr_null(rallocx(p, SIZE_T_MAX, 0),
"Expected OOM for rallocx(p, size=%#zx, 0)", SIZE_T_MAX);
- assert_ptr_null(rallocx(p, 1, MALLOCX_ALIGN(ZU(PTRDIFF_MAX)+1)),
+ expect_ptr_null(rallocx(p, 1, MALLOCX_ALIGN(ZU(PTRDIFF_MAX)+1)),
"Expected OOM for rallocx(p, size=1, MALLOCX_ALIGN(%#zx))",
ZU(PTRDIFF_MAX)+1);
@@ -253,6 +302,7 @@ main(void) {
test_grow_and_shrink,
test_zero,
test_align,
+ test_align_enum,
test_lg_align_and_zero,
test_overflow);
}
diff --git a/test/integration/slab_sizes.c b/test/integration/slab_sizes.c
index af250c3f46fb..f6a66f2162b4 100644
--- a/test/integration/slab_sizes.c
+++ b/test/integration/slab_sizes.c
@@ -10,19 +10,19 @@ TEST_BEGIN(test_slab_sizes) {
size_t len;
len = sizeof(nbins);
- assert_d_eq(mallctl("arenas.nbins", &nbins, &len, NULL, 0), 0,
+ expect_d_eq(mallctl("arenas.nbins", &nbins, &len, NULL, 0), 0,
"nbins mallctl failure");
len = sizeof(page);
- assert_d_eq(mallctl("arenas.page", &page, &len, NULL, 0), 0,
+ expect_d_eq(mallctl("arenas.page", &page, &len, NULL, 0), 0,
"page mallctl failure");
len = 4;
- assert_d_eq(mallctlnametomib("arenas.bin.0.size", sizemib, &len), 0,
+ expect_d_eq(mallctlnametomib("arenas.bin.0.size", sizemib, &len), 0,
"bin size mallctlnametomib failure");
len = 4;
- assert_d_eq(mallctlnametomib("arenas.bin.0.slab_size", slabmib, &len),
+ expect_d_eq(mallctlnametomib("arenas.bin.0.slab_size", slabmib, &len),
0, "slab size mallctlnametomib failure");
size_t biggest_slab_seen = 0;
@@ -33,11 +33,11 @@ TEST_BEGIN(test_slab_sizes) {
len = sizeof(size_t);
sizemib[2] = i;
slabmib[2] = i;
- assert_d_eq(mallctlbymib(sizemib, 4, (void *)&bin_size, &len,
+ expect_d_eq(mallctlbymib(sizemib, 4, (void *)&bin_size, &len,
NULL, 0), 0, "bin size mallctlbymib failure");
len = sizeof(size_t);
- assert_d_eq(mallctlbymib(slabmib, 4, (void *)&slab_size, &len,
+ expect_d_eq(mallctlbymib(slabmib, 4, (void *)&slab_size, &len,
NULL, 0), 0, "slab size mallctlbymib failure");
if (bin_size < 100) {
@@ -48,19 +48,19 @@ TEST_BEGIN(test_slab_sizes) {
* should at least make sure that the number of pages
* goes up.
*/
- assert_zu_ge(slab_size, biggest_slab_seen,
+ expect_zu_ge(slab_size, biggest_slab_seen,
"Slab sizes should go up");
biggest_slab_seen = slab_size;
} else if (
(100 <= bin_size && bin_size < 128)
|| (128 < bin_size && bin_size <= 200)) {
- assert_zu_eq(slab_size, page,
+ expect_zu_eq(slab_size, page,
"Forced-small slabs should be small");
} else if (bin_size == 128) {
- assert_zu_eq(slab_size, 2 * page,
+ expect_zu_eq(slab_size, 2 * page,
"Forced-2-page slab should be 2 pages");
} else if (200 < bin_size && bin_size <= 4096) {
- assert_zu_ge(slab_size, biggest_slab_seen,
+ expect_zu_ge(slab_size, biggest_slab_seen,
"Slab sizes should go up");
biggest_slab_seen = slab_size;
}
@@ -69,7 +69,7 @@ TEST_BEGIN(test_slab_sizes) {
* For any reasonable configuration, 17 pages should be a valid slab
* size for 4096-byte items.
*/
- assert_zu_eq(biggest_slab_seen, 17 * page, "Didn't hit page target");
+ expect_zu_eq(biggest_slab_seen, 17 * page, "Didn't hit page target");
}
TEST_END
diff --git a/test/integration/smallocx.c b/test/integration/smallocx.c
index 2486752bebbc..389319b7fa25 100644
--- a/test/integration/smallocx.c
+++ b/test/integration/smallocx.c
@@ -26,7 +26,7 @@ get_nsizes_impl(const char *cmd) {
size_t z;
z = sizeof(unsigned);
- assert_d_eq(mallctl(cmd, (void *)&ret, &z, NULL, 0), 0,
+ expect_d_eq(mallctl(cmd, (void *)&ret, &z, NULL, 0), 0,
"Unexpected mallctl(\"%s\", ...) failure", cmd);
return ret;
@@ -45,11 +45,11 @@ get_size_impl(const char *cmd, size_t ind) {
size_t miblen = 4;
z = sizeof(size_t);
- assert_d_eq(mallctlnametomib(cmd, mib, &miblen),
+ expect_d_eq(mallctlnametomib(cmd, mib, &miblen),
0, "Unexpected mallctlnametomib(\"%s\", ...) failure", cmd);
mib[2] = ind;
z = sizeof(size_t);
- assert_d_eq(mallctlbymib(mib, miblen, (void *)&ret, &z, NULL, 0),
+ expect_d_eq(mallctlbymib(mib, miblen, (void *)&ret, &z, NULL, 0),
0, "Unexpected mallctlbymib([\"%s\", %zu], ...) failure", cmd, ind);
return ret;
@@ -67,7 +67,7 @@ get_large_size(size_t ind) {
*/
static void
purge(void) {
- assert_d_eq(mallctl("arena.0.purge", NULL, NULL, NULL, 0), 0,
+ expect_d_eq(mallctl("arena.0.purge", NULL, NULL, NULL, 0), 0,
"Unexpected mallctl error");
}
@@ -86,16 +86,16 @@ TEST_BEGIN(test_overflow) {
largemax = get_large_size(get_nlarge()-1);
- assert_ptr_null(smallocx(largemax+1, 0).ptr,
+ expect_ptr_null(smallocx(largemax+1, 0).ptr,
"Expected OOM for smallocx(size=%#zx, 0)", largemax+1);
- assert_ptr_null(smallocx(ZU(PTRDIFF_MAX)+1, 0).ptr,
+ expect_ptr_null(smallocx(ZU(PTRDIFF_MAX)+1, 0).ptr,
"Expected OOM for smallocx(size=%#zx, 0)", ZU(PTRDIFF_MAX)+1);
- assert_ptr_null(smallocx(SIZE_T_MAX, 0).ptr,
+ expect_ptr_null(smallocx(SIZE_T_MAX, 0).ptr,
"Expected OOM for smallocx(size=%#zx, 0)", SIZE_T_MAX);
- assert_ptr_null(smallocx(1, MALLOCX_ALIGN(ZU(PTRDIFF_MAX)+1)).ptr,
+ expect_ptr_null(smallocx(1, MALLOCX_ALIGN(ZU(PTRDIFF_MAX)+1)).ptr,
"Expected OOM for smallocx(size=1, MALLOCX_ALIGN(%#zx))",
ZU(PTRDIFF_MAX)+1);
}
@@ -105,17 +105,17 @@ static void *
remote_alloc(void *arg) {
unsigned arena;
size_t sz = sizeof(unsigned);
- assert_d_eq(mallctl("arenas.create", (void *)&arena, &sz, NULL, 0), 0,
+ expect_d_eq(mallctl("arenas.create", (void *)&arena, &sz, NULL, 0), 0,
"Unexpected mallctl() failure");
size_t large_sz;
sz = sizeof(size_t);
- assert_d_eq(mallctl("arenas.lextent.0.size", (void *)&large_sz, &sz,
+ expect_d_eq(mallctl("arenas.lextent.0.size", (void *)&large_sz, &sz,
NULL, 0), 0, "Unexpected mallctl failure");
smallocx_return_t r
= smallocx(large_sz, MALLOCX_ARENA(arena) | MALLOCX_TCACHE_NONE);
void *ptr = r.ptr;
- assert_zu_eq(r.size,
+ expect_zu_eq(r.size,
nallocx(large_sz, MALLOCX_ARENA(arena) | MALLOCX_TCACHE_NONE),
"Expected smalloc(size,flags).size == nallocx(size,flags)");
void **ret = (void **)arg;
@@ -129,7 +129,7 @@ TEST_BEGIN(test_remote_free) {
void *ret;
thd_create(&thd, remote_alloc, (void *)&ret);
thd_join(thd, NULL);
- assert_ptr_not_null(ret, "Unexpected smallocx failure");
+ expect_ptr_not_null(ret, "Unexpected smallocx failure");
/* Avoid TCACHE_NONE to explicitly test tcache_flush(). */
dallocx(ret, 0);
@@ -155,7 +155,7 @@ TEST_BEGIN(test_oom) {
oom = true;
}
}
- assert_true(oom,
+ expect_true(oom,
"Expected OOM during series of calls to smallocx(size=%zu, 0)",
largemax);
for (i = 0; i < sizeof(ptrs) / sizeof(void *); i++) {
@@ -166,14 +166,14 @@ TEST_BEGIN(test_oom) {
purge();
#if LG_SIZEOF_PTR == 3
- assert_ptr_null(smallocx(0x8000000000000000ULL,
+ expect_ptr_null(smallocx(0x8000000000000000ULL,
MALLOCX_ALIGN(0x8000000000000000ULL)).ptr,
"Expected OOM for smallocx()");
- assert_ptr_null(smallocx(0x8000000000000000ULL,
+ expect_ptr_null(smallocx(0x8000000000000000ULL,
MALLOCX_ALIGN(0x80000000)).ptr,
"Expected OOM for smallocx()");
#else
- assert_ptr_null(smallocx(0x80000000UL, MALLOCX_ALIGN(0x80000000UL)).ptr,
+ expect_ptr_null(smallocx(0x80000000UL, MALLOCX_ALIGN(0x80000000UL)).ptr,
"Expected OOM for smallocx()");
#endif
}
@@ -191,36 +191,36 @@ TEST_BEGIN(test_basic) {
size_t nsz, rsz, smz;
void *p;
nsz = nallocx(sz, 0);
- assert_zu_ne(nsz, 0, "Unexpected nallocx() error");
+ expect_zu_ne(nsz, 0, "Unexpected nallocx() error");
ret = smallocx(sz, 0);
p = ret.ptr;
smz = ret.size;
- assert_ptr_not_null(p,
+ expect_ptr_not_null(p,
"Unexpected smallocx(size=%zx, flags=0) error", sz);
rsz = sallocx(p, 0);
- assert_zu_ge(rsz, sz, "Real size smaller than expected");
- assert_zu_eq(nsz, rsz, "nallocx()/sallocx() size mismatch");
- assert_zu_eq(nsz, smz, "nallocx()/smallocx() size mismatch");
+ expect_zu_ge(rsz, sz, "Real size smaller than expected");
+ expect_zu_eq(nsz, rsz, "nallocx()/sallocx() size mismatch");
+ expect_zu_eq(nsz, smz, "nallocx()/smallocx() size mismatch");
dallocx(p, 0);
ret = smallocx(sz, 0);
p = ret.ptr;
smz = ret.size;
- assert_ptr_not_null(p,
+ expect_ptr_not_null(p,
"Unexpected smallocx(size=%zx, flags=0) error", sz);
dallocx(p, 0);
nsz = nallocx(sz, MALLOCX_ZERO);
- assert_zu_ne(nsz, 0, "Unexpected nallocx() error");
- assert_zu_ne(smz, 0, "Unexpected smallocx() error");
+ expect_zu_ne(nsz, 0, "Unexpected nallocx() error");
+ expect_zu_ne(smz, 0, "Unexpected smallocx() error");
ret = smallocx(sz, MALLOCX_ZERO);
p = ret.ptr;
- assert_ptr_not_null(p,
+ expect_ptr_not_null(p,
"Unexpected smallocx(size=%zx, flags=MALLOCX_ZERO) error",
nsz);
rsz = sallocx(p, 0);
- assert_zu_eq(nsz, rsz, "nallocx()/sallocx() rsize mismatch");
- assert_zu_eq(nsz, smz, "nallocx()/smallocx() size mismatch");
+ expect_zu_eq(nsz, rsz, "nallocx()/sallocx() rsize mismatch");
+ expect_zu_eq(nsz, smz, "nallocx()/smallocx() size mismatch");
dallocx(p, 0);
purge();
}
@@ -257,27 +257,27 @@ TEST_BEGIN(test_alignment_and_size) {
for (i = 0; i < NITER; i++) {
nsz = nallocx(sz, MALLOCX_ALIGN(alignment) |
MALLOCX_ZERO);
- assert_zu_ne(nsz, 0,
+ expect_zu_ne(nsz, 0,
"nallocx() error for alignment=%zu, "
"size=%zu (%#zx)", alignment, sz, sz);
smallocx_return_t ret
= smallocx(sz, MALLOCX_ALIGN(alignment) | MALLOCX_ZERO);
ps[i] = ret.ptr;
- assert_ptr_not_null(ps[i],
+ expect_ptr_not_null(ps[i],
"smallocx() error for alignment=%zu, "
"size=%zu (%#zx)", alignment, sz, sz);
rsz = sallocx(ps[i], 0);
smz = ret.size;
- assert_zu_ge(rsz, sz,
+ expect_zu_ge(rsz, sz,
"Real size smaller than expected for "
"alignment=%zu, size=%zu", alignment, sz);
- assert_zu_eq(nsz, rsz,
+ expect_zu_eq(nsz, rsz,
"nallocx()/sallocx() size mismatch for "
"alignment=%zu, size=%zu", alignment, sz);
- assert_zu_eq(nsz, smz,
+ expect_zu_eq(nsz, smz,
"nallocx()/smallocx() size mismatch for "
"alignment=%zu, size=%zu", alignment, sz);
- assert_ptr_null(
+ expect_ptr_null(
(void *)((uintptr_t)ps[i] & (alignment-1)),
"%p inadequately aligned for"
" alignment=%zu, size=%zu", ps[i],
diff --git a/test/integration/thread_arena.c b/test/integration/thread_arena.c
index 1e5ec05d8b9a..4a6abf6459d7 100644
--- a/test/integration/thread_arena.c
+++ b/test/integration/thread_arena.c
@@ -11,7 +11,7 @@ thd_start(void *arg) {
int err;
p = malloc(1);
- assert_ptr_not_null(p, "Error in malloc()");
+ expect_ptr_not_null(p, "Error in malloc()");
free(p);
size = sizeof(arena_ind);
@@ -31,7 +31,7 @@ thd_start(void *arg) {
buferror(err, buf, sizeof(buf));
test_fail("Error in mallctl(): %s", buf);
}
- assert_u_eq(arena_ind, main_arena_ind,
+ expect_u_eq(arena_ind, main_arena_ind,
"Arena index should be same as for main thread");
return NULL;
@@ -52,11 +52,11 @@ TEST_BEGIN(test_thread_arena) {
unsigned i;
p = malloc(1);
- assert_ptr_not_null(p, "Error in malloc()");
+ expect_ptr_not_null(p, "Error in malloc()");
unsigned arena_ind, old_arena_ind;
size_t sz = sizeof(unsigned);
- assert_d_eq(mallctl("arenas.create", (void *)&arena_ind, &sz, NULL, 0),
+ expect_d_eq(mallctl("arenas.create", (void *)&arena_ind, &sz, NULL, 0),
0, "Arena creation failure");
size_t size = sizeof(arena_ind);
@@ -73,7 +73,7 @@ TEST_BEGIN(test_thread_arena) {
for (i = 0; i < NTHREADS; i++) {
intptr_t join_ret;
thd_join(thds[i], (void *)&join_ret);
- assert_zd_eq(join_ret, 0, "Unexpected thread join error");
+ expect_zd_eq(join_ret, 0, "Unexpected thread join error");
}
free(p);
}
diff --git a/test/integration/thread_tcache_enabled.c b/test/integration/thread_tcache_enabled.c
index 95c9acc138c5..d44dbe904290 100644
--- a/test/integration/thread_tcache_enabled.c
+++ b/test/integration/thread_tcache_enabled.c
@@ -4,59 +4,59 @@ void *
thd_start(void *arg) {
bool e0, e1;
size_t sz = sizeof(bool);
- assert_d_eq(mallctl("thread.tcache.enabled", (void *)&e0, &sz, NULL,
+ expect_d_eq(mallctl("thread.tcache.enabled", (void *)&e0, &sz, NULL,
0), 0, "Unexpected mallctl failure");
if (e0) {
e1 = false;
- assert_d_eq(mallctl("thread.tcache.enabled", (void *)&e0, &sz,
+ expect_d_eq(mallctl("thread.tcache.enabled", (void *)&e0, &sz,
(void *)&e1, sz), 0, "Unexpected mallctl() error");
- assert_true(e0, "tcache should be enabled");
+ expect_true(e0, "tcache should be enabled");
}
e1 = true;
- assert_d_eq(mallctl("thread.tcache.enabled", (void *)&e0, &sz,
+ expect_d_eq(mallctl("thread.tcache.enabled", (void *)&e0, &sz,
(void *)&e1, sz), 0, "Unexpected mallctl() error");
- assert_false(e0, "tcache should be disabled");
+ expect_false(e0, "tcache should be disabled");
e1 = true;
- assert_d_eq(mallctl("thread.tcache.enabled", (void *)&e0, &sz,
+ expect_d_eq(mallctl("thread.tcache.enabled", (void *)&e0, &sz,
(void *)&e1, sz), 0, "Unexpected mallctl() error");
- assert_true(e0, "tcache should be enabled");
+ expect_true(e0, "tcache should be enabled");
e1 = false;
- assert_d_eq(mallctl("thread.tcache.enabled", (void *)&e0, &sz,
+ expect_d_eq(mallctl("thread.tcache.enabled", (void *)&e0, &sz,
(void *)&e1, sz), 0, "Unexpected mallctl() error");
- assert_true(e0, "tcache should be enabled");
+ expect_true(e0, "tcache should be enabled");
e1 = false;
- assert_d_eq(mallctl("thread.tcache.enabled", (void *)&e0, &sz,
+ expect_d_eq(mallctl("thread.tcache.enabled", (void *)&e0, &sz,
(void *)&e1, sz), 0, "Unexpected mallctl() error");
- assert_false(e0, "tcache should be disabled");
+ expect_false(e0, "tcache should be disabled");
free(malloc(1));
e1 = true;
- assert_d_eq(mallctl("thread.tcache.enabled", (void *)&e0, &sz,
+ expect_d_eq(mallctl("thread.tcache.enabled", (void *)&e0, &sz,
(void *)&e1, sz), 0, "Unexpected mallctl() error");
- assert_false(e0, "tcache should be disabled");
+ expect_false(e0, "tcache should be disabled");
free(malloc(1));
e1 = true;
- assert_d_eq(mallctl("thread.tcache.enabled", (void *)&e0, &sz,
+ expect_d_eq(mallctl("thread.tcache.enabled", (void *)&e0, &sz,
(void *)&e1, sz), 0, "Unexpected mallctl() error");
- assert_true(e0, "tcache should be enabled");
+ expect_true(e0, "tcache should be enabled");
free(malloc(1));
e1 = false;
- assert_d_eq(mallctl("thread.tcache.enabled", (void *)&e0, &sz,
+ expect_d_eq(mallctl("thread.tcache.enabled", (void *)&e0, &sz,
(void *)&e1, sz), 0, "Unexpected mallctl() error");
- assert_true(e0, "tcache should be enabled");
+ expect_true(e0, "tcache should be enabled");
free(malloc(1));
e1 = false;
- assert_d_eq(mallctl("thread.tcache.enabled", (void *)&e0, &sz,
+ expect_d_eq(mallctl("thread.tcache.enabled", (void *)&e0, &sz,
(void *)&e1, sz), 0, "Unexpected mallctl() error");
- assert_false(e0, "tcache should be disabled");
+ expect_false(e0, "tcache should be disabled");
free(malloc(1));
return NULL;
diff --git a/test/integration/xallocx.c b/test/integration/xallocx.c
index cd0ca048d10a..137085486c59 100644
--- a/test/integration/xallocx.c
+++ b/test/integration/xallocx.c
@@ -11,7 +11,7 @@ arena_ind(void) {
if (ind == 0) {
size_t sz = sizeof(ind);
- assert_d_eq(mallctl("arenas.create", (void *)&ind, &sz, NULL,
+ expect_d_eq(mallctl("arenas.create", (void *)&ind, &sz, NULL,
0), 0, "Unexpected mallctl failure creating arena");
}
@@ -23,11 +23,11 @@ TEST_BEGIN(test_same_size) {
size_t sz, tsz;
p = mallocx(42, 0);
- assert_ptr_not_null(p, "Unexpected mallocx() error");
+ expect_ptr_not_null(p, "Unexpected mallocx() error");
sz = sallocx(p, 0);
tsz = xallocx(p, sz, 0, 0);
- assert_zu_eq(tsz, sz, "Unexpected size change: %zu --> %zu", sz, tsz);
+ expect_zu_eq(tsz, sz, "Unexpected size change: %zu --> %zu", sz, tsz);
dallocx(p, 0);
}
@@ -38,11 +38,11 @@ TEST_BEGIN(test_extra_no_move) {
size_t sz, tsz;
p = mallocx(42, 0);
- assert_ptr_not_null(p, "Unexpected mallocx() error");
+ expect_ptr_not_null(p, "Unexpected mallocx() error");
sz = sallocx(p, 0);
tsz = xallocx(p, sz, sz-42, 0);
- assert_zu_eq(tsz, sz, "Unexpected size change: %zu --> %zu", sz, tsz);
+ expect_zu_eq(tsz, sz, "Unexpected size change: %zu --> %zu", sz, tsz);
dallocx(p, 0);
}
@@ -53,11 +53,11 @@ TEST_BEGIN(test_no_move_fail) {
size_t sz, tsz;
p = mallocx(42, 0);
- assert_ptr_not_null(p, "Unexpected mallocx() error");
+ expect_ptr_not_null(p, "Unexpected mallocx() error");
sz = sallocx(p, 0);
tsz = xallocx(p, sz + 5, 0, 0);
- assert_zu_eq(tsz, sz, "Unexpected size change: %zu --> %zu", sz, tsz);
+ expect_zu_eq(tsz, sz, "Unexpected size change: %zu --> %zu", sz, tsz);
dallocx(p, 0);
}
@@ -69,7 +69,7 @@ get_nsizes_impl(const char *cmd) {
size_t z;
z = sizeof(unsigned);
- assert_d_eq(mallctl(cmd, (void *)&ret, &z, NULL, 0), 0,
+ expect_d_eq(mallctl(cmd, (void *)&ret, &z, NULL, 0), 0,
"Unexpected mallctl(\"%s\", ...) failure", cmd);
return ret;
@@ -93,11 +93,11 @@ get_size_impl(const char *cmd, size_t ind) {
size_t miblen = 4;
z = sizeof(size_t);
- assert_d_eq(mallctlnametomib(cmd, mib, &miblen),
+ expect_d_eq(mallctlnametomib(cmd, mib, &miblen),
0, "Unexpected mallctlnametomib(\"%s\", ...) failure", cmd);
mib[2] = ind;
z = sizeof(size_t);
- assert_d_eq(mallctlbymib(mib, miblen, (void *)&ret, &z, NULL, 0),
+ expect_d_eq(mallctlbymib(mib, miblen, (void *)&ret, &z, NULL, 0),
0, "Unexpected mallctlbymib([\"%s\", %zu], ...) failure", cmd, ind);
return ret;
@@ -122,20 +122,20 @@ TEST_BEGIN(test_size) {
largemax = get_large_size(get_nlarge()-1);
p = mallocx(small0, 0);
- assert_ptr_not_null(p, "Unexpected mallocx() error");
+ expect_ptr_not_null(p, "Unexpected mallocx() error");
/* Test smallest supported size. */
- assert_zu_eq(xallocx(p, 1, 0, 0), small0,
+ expect_zu_eq(xallocx(p, 1, 0, 0), small0,
"Unexpected xallocx() behavior");
/* Test largest supported size. */
- assert_zu_le(xallocx(p, largemax, 0, 0), largemax,
+ expect_zu_le(xallocx(p, largemax, 0, 0), largemax,
"Unexpected xallocx() behavior");
/* Test size overflow. */
- assert_zu_le(xallocx(p, largemax+1, 0, 0), largemax,
+ expect_zu_le(xallocx(p, largemax+1, 0, 0), largemax,
"Unexpected xallocx() behavior");
- assert_zu_le(xallocx(p, SIZE_T_MAX, 0, 0), largemax,
+ expect_zu_le(xallocx(p, SIZE_T_MAX, 0, 0), largemax,
"Unexpected xallocx() behavior");
dallocx(p, 0);
@@ -151,22 +151,22 @@ TEST_BEGIN(test_size_extra_overflow) {
largemax = get_large_size(get_nlarge()-1);
p = mallocx(small0, 0);
- assert_ptr_not_null(p, "Unexpected mallocx() error");
+ expect_ptr_not_null(p, "Unexpected mallocx() error");
/* Test overflows that can be resolved by clamping extra. */
- assert_zu_le(xallocx(p, largemax-1, 2, 0), largemax,
+ expect_zu_le(xallocx(p, largemax-1, 2, 0), largemax,
"Unexpected xallocx() behavior");
- assert_zu_le(xallocx(p, largemax, 1, 0), largemax,
+ expect_zu_le(xallocx(p, largemax, 1, 0), largemax,
"Unexpected xallocx() behavior");
/* Test overflow such that largemax-size underflows. */
- assert_zu_le(xallocx(p, largemax+1, 2, 0), largemax,
+ expect_zu_le(xallocx(p, largemax+1, 2, 0), largemax,
"Unexpected xallocx() behavior");
- assert_zu_le(xallocx(p, largemax+2, 3, 0), largemax,
+ expect_zu_le(xallocx(p, largemax+2, 3, 0), largemax,
"Unexpected xallocx() behavior");
- assert_zu_le(xallocx(p, SIZE_T_MAX-2, 2, 0), largemax,
+ expect_zu_le(xallocx(p, SIZE_T_MAX-2, 2, 0), largemax,
"Unexpected xallocx() behavior");
- assert_zu_le(xallocx(p, SIZE_T_MAX-1, 1, 0), largemax,
+ expect_zu_le(xallocx(p, SIZE_T_MAX-1, 1, 0), largemax,
"Unexpected xallocx() behavior");
dallocx(p, 0);
@@ -183,21 +183,21 @@ TEST_BEGIN(test_extra_small) {
largemax = get_large_size(get_nlarge()-1);
p = mallocx(small0, 0);
- assert_ptr_not_null(p, "Unexpected mallocx() error");
+ expect_ptr_not_null(p, "Unexpected mallocx() error");
- assert_zu_eq(xallocx(p, small1, 0, 0), small0,
+ expect_zu_eq(xallocx(p, small1, 0, 0), small0,
"Unexpected xallocx() behavior");
- assert_zu_eq(xallocx(p, small1, 0, 0), small0,
+ expect_zu_eq(xallocx(p, small1, 0, 0), small0,
"Unexpected xallocx() behavior");
- assert_zu_eq(xallocx(p, small0, small1 - small0, 0), small0,
+ expect_zu_eq(xallocx(p, small0, small1 - small0, 0), small0,
"Unexpected xallocx() behavior");
/* Test size+extra overflow. */
- assert_zu_eq(xallocx(p, small0, largemax - small0 + 1, 0), small0,
+ expect_zu_eq(xallocx(p, small0, largemax - small0 + 1, 0), small0,
"Unexpected xallocx() behavior");
- assert_zu_eq(xallocx(p, small0, SIZE_T_MAX - small0, 0), small0,
+ expect_zu_eq(xallocx(p, small0, SIZE_T_MAX - small0, 0), small0,
"Unexpected xallocx() behavior");
dallocx(p, 0);
@@ -217,56 +217,56 @@ TEST_BEGIN(test_extra_large) {
largemax = get_large_size(get_nlarge()-1);
p = mallocx(large3, flags);
- assert_ptr_not_null(p, "Unexpected mallocx() error");
+ expect_ptr_not_null(p, "Unexpected mallocx() error");
- assert_zu_eq(xallocx(p, large3, 0, flags), large3,
+ expect_zu_eq(xallocx(p, large3, 0, flags), large3,
"Unexpected xallocx() behavior");
/* Test size decrease with zero extra. */
- assert_zu_ge(xallocx(p, large1, 0, flags), large1,
+ expect_zu_ge(xallocx(p, large1, 0, flags), large1,
"Unexpected xallocx() behavior");
- assert_zu_ge(xallocx(p, smallmax, 0, flags), large1,
+ expect_zu_ge(xallocx(p, smallmax, 0, flags), large1,
"Unexpected xallocx() behavior");
if (xallocx(p, large3, 0, flags) != large3) {
p = rallocx(p, large3, flags);
- assert_ptr_not_null(p, "Unexpected rallocx() failure");
+ expect_ptr_not_null(p, "Unexpected rallocx() failure");
}
/* Test size decrease with non-zero extra. */
- assert_zu_eq(xallocx(p, large1, large3 - large1, flags), large3,
+ expect_zu_eq(xallocx(p, large1, large3 - large1, flags), large3,
"Unexpected xallocx() behavior");
- assert_zu_eq(xallocx(p, large2, large3 - large2, flags), large3,
+ expect_zu_eq(xallocx(p, large2, large3 - large2, flags), large3,
"Unexpected xallocx() behavior");
- assert_zu_ge(xallocx(p, large1, large2 - large1, flags), large2,
+ expect_zu_ge(xallocx(p, large1, large2 - large1, flags), large2,
"Unexpected xallocx() behavior");
- assert_zu_ge(xallocx(p, smallmax, large1 - smallmax, flags), large1,
+ expect_zu_ge(xallocx(p, smallmax, large1 - smallmax, flags), large1,
"Unexpected xallocx() behavior");
- assert_zu_ge(xallocx(p, large1, 0, flags), large1,
+ expect_zu_ge(xallocx(p, large1, 0, flags), large1,
"Unexpected xallocx() behavior");
/* Test size increase with zero extra. */
- assert_zu_le(xallocx(p, large3, 0, flags), large3,
+ expect_zu_le(xallocx(p, large3, 0, flags), large3,
"Unexpected xallocx() behavior");
- assert_zu_le(xallocx(p, largemax+1, 0, flags), large3,
+ expect_zu_le(xallocx(p, largemax+1, 0, flags), large3,
"Unexpected xallocx() behavior");
- assert_zu_ge(xallocx(p, large1, 0, flags), large1,
+ expect_zu_ge(xallocx(p, large1, 0, flags), large1,
"Unexpected xallocx() behavior");
/* Test size increase with non-zero extra. */
- assert_zu_le(xallocx(p, large1, SIZE_T_MAX - large1, flags), largemax,
+ expect_zu_le(xallocx(p, large1, SIZE_T_MAX - large1, flags), largemax,
"Unexpected xallocx() behavior");
- assert_zu_ge(xallocx(p, large1, 0, flags), large1,
+ expect_zu_ge(xallocx(p, large1, 0, flags), large1,
"Unexpected xallocx() behavior");
/* Test size increase with non-zero extra. */
- assert_zu_le(xallocx(p, large1, large3 - large1, flags), large3,
+ expect_zu_le(xallocx(p, large1, large3 - large1, flags), large3,
"Unexpected xallocx() behavior");
if (xallocx(p, large3, 0, flags) != large3) {
p = rallocx(p, large3, flags);
- assert_ptr_not_null(p, "Unexpected rallocx() failure");
+ expect_ptr_not_null(p, "Unexpected rallocx() failure");
}
/* Test size+extra overflow. */
- assert_zu_le(xallocx(p, large3, largemax - large3 + 1, flags), largemax,
+ expect_zu_le(xallocx(p, large3, largemax - large3 + 1, flags), largemax,
"Unexpected xallocx() behavior");
dallocx(p, flags);
@@ -320,8 +320,8 @@ test_zero(size_t szmin, size_t szmax) {
sz = szmax;
p = mallocx(sz, flags);
- assert_ptr_not_null(p, "Unexpected mallocx() error");
- assert_false(validate_fill(p, 0x00, 0, sz), "Memory not filled: sz=%zu",
+ expect_ptr_not_null(p, "Unexpected mallocx() error");
+ expect_false(validate_fill(p, 0x00, 0, sz), "Memory not filled: sz=%zu",
sz);
/*
@@ -329,30 +329,30 @@ test_zero(size_t szmin, size_t szmax) {
* errors.
*/
memset(p, FILL_BYTE, sz);
- assert_false(validate_fill(p, FILL_BYTE, 0, sz),
+ expect_false(validate_fill(p, FILL_BYTE, 0, sz),
"Memory not filled: sz=%zu", sz);
/* Shrink in place so that we can expect growing in place to succeed. */
sz = szmin;
if (xallocx(p, sz, 0, flags) != sz) {
p = rallocx(p, sz, flags);
- assert_ptr_not_null(p, "Unexpected rallocx() failure");
+ expect_ptr_not_null(p, "Unexpected rallocx() failure");
}
- assert_false(validate_fill(p, FILL_BYTE, 0, sz),
+ expect_false(validate_fill(p, FILL_BYTE, 0, sz),
"Memory not filled: sz=%zu", sz);
for (sz = szmin; sz < szmax; sz = nsz) {
nsz = nallocx(sz+1, flags);
if (xallocx(p, sz+1, 0, flags) != nsz) {
p = rallocx(p, sz+1, flags);
- assert_ptr_not_null(p, "Unexpected rallocx() failure");
+ expect_ptr_not_null(p, "Unexpected rallocx() failure");
}
- assert_false(validate_fill(p, FILL_BYTE, 0, sz),
+ expect_false(validate_fill(p, FILL_BYTE, 0, sz),
"Memory not filled: sz=%zu", sz);
- assert_false(validate_fill(p, 0x00, sz, nsz-sz),
+ expect_false(validate_fill(p, 0x00, sz, nsz-sz),
"Memory not filled: sz=%zu, nsz-sz=%zu", sz, nsz-sz);
memset((void *)((uintptr_t)p + sz), FILL_BYTE, nsz-sz);
- assert_false(validate_fill(p, FILL_BYTE, 0, nsz),
+ expect_false(validate_fill(p, FILL_BYTE, 0, nsz),
"Memory not filled: nsz=%zu", nsz);
}