summaryrefslogtreecommitdiff
path: root/test/unit/prof_stats.c
diff options
context:
space:
mode:
Diffstat (limited to 'test/unit/prof_stats.c')
-rw-r--r--test/unit/prof_stats.c151
1 files changed, 151 insertions, 0 deletions
diff --git a/test/unit/prof_stats.c b/test/unit/prof_stats.c
new file mode 100644
index 000000000..c88c4ae0f
--- /dev/null
+++ b/test/unit/prof_stats.c
@@ -0,0 +1,151 @@
+#include "test/jemalloc_test.h"
+
+#define N_PTRS 3
+
+static void
+test_combinations(szind_t ind, size_t sizes_array[N_PTRS],
+ int flags_array[N_PTRS]) {
+#define MALLCTL_STR_LEN 64
+ assert(opt_prof && opt_prof_stats);
+
+ char mallctl_live_str[MALLCTL_STR_LEN];
+ char mallctl_accum_str[MALLCTL_STR_LEN];
+ if (ind < SC_NBINS) {
+ malloc_snprintf(mallctl_live_str, MALLCTL_STR_LEN,
+ "prof.stats.bins.%u.live", (unsigned)ind);
+ malloc_snprintf(mallctl_accum_str, MALLCTL_STR_LEN,
+ "prof.stats.bins.%u.accum", (unsigned)ind);
+ } else {
+ malloc_snprintf(mallctl_live_str, MALLCTL_STR_LEN,
+ "prof.stats.lextents.%u.live", (unsigned)(ind - SC_NBINS));
+ malloc_snprintf(mallctl_accum_str, MALLCTL_STR_LEN,
+ "prof.stats.lextents.%u.accum", (unsigned)(ind - SC_NBINS));
+ }
+
+ size_t stats_len = 2 * sizeof(uint64_t);
+
+ uint64_t live_stats_orig[2];
+ assert_d_eq(mallctl(mallctl_live_str, &live_stats_orig, &stats_len,
+ NULL, 0), 0, "");
+ uint64_t accum_stats_orig[2];
+ assert_d_eq(mallctl(mallctl_accum_str, &accum_stats_orig, &stats_len,
+ NULL, 0), 0, "");
+
+ void *ptrs[N_PTRS];
+
+ uint64_t live_req_sum = 0;
+ uint64_t live_count = 0;
+ uint64_t accum_req_sum = 0;
+ uint64_t accum_count = 0;
+
+ for (size_t i = 0; i < N_PTRS; ++i) {
+ size_t sz = sizes_array[i];
+ int flags = flags_array[i];
+ void *p = mallocx(sz, flags);
+ assert_ptr_not_null(p, "malloc() failed");
+ assert(TEST_MALLOC_SIZE(p) == sz_index2size(ind));
+ ptrs[i] = p;
+ live_req_sum += sz;
+ live_count++;
+ accum_req_sum += sz;
+ accum_count++;
+ uint64_t live_stats[2];
+ assert_d_eq(mallctl(mallctl_live_str, &live_stats, &stats_len,
+ NULL, 0), 0, "");
+ expect_u64_eq(live_stats[0] - live_stats_orig[0],
+ live_req_sum, "");
+ expect_u64_eq(live_stats[1] - live_stats_orig[1],
+ live_count, "");
+ uint64_t accum_stats[2];
+ assert_d_eq(mallctl(mallctl_accum_str, &accum_stats, &stats_len,
+ NULL, 0), 0, "");
+ expect_u64_eq(accum_stats[0] - accum_stats_orig[0],
+ accum_req_sum, "");
+ expect_u64_eq(accum_stats[1] - accum_stats_orig[1],
+ accum_count, "");
+ }
+
+ for (size_t i = 0; i < N_PTRS; ++i) {
+ size_t sz = sizes_array[i];
+ int flags = flags_array[i];
+ sdallocx(ptrs[i], sz, flags);
+ live_req_sum -= sz;
+ live_count--;
+ uint64_t live_stats[2];
+ assert_d_eq(mallctl(mallctl_live_str, &live_stats, &stats_len,
+ NULL, 0), 0, "");
+ expect_u64_eq(live_stats[0] - live_stats_orig[0],
+ live_req_sum, "");
+ expect_u64_eq(live_stats[1] - live_stats_orig[1],
+ live_count, "");
+ uint64_t accum_stats[2];
+ assert_d_eq(mallctl(mallctl_accum_str, &accum_stats, &stats_len,
+ NULL, 0), 0, "");
+ expect_u64_eq(accum_stats[0] - accum_stats_orig[0],
+ accum_req_sum, "");
+ expect_u64_eq(accum_stats[1] - accum_stats_orig[1],
+ accum_count, "");
+ }
+#undef MALLCTL_STR_LEN
+}
+
+static void
+test_szind_wrapper(szind_t ind) {
+ size_t sizes_array[N_PTRS];
+ int flags_array[N_PTRS];
+ for (size_t i = 0, sz = sz_index2size(ind) - N_PTRS; i < N_PTRS;
+ ++i, ++sz) {
+ sizes_array[i] = sz;
+ flags_array[i] = 0;
+ }
+ test_combinations(ind, sizes_array, flags_array);
+}
+
+TEST_BEGIN(test_prof_stats) {
+ test_skip_if(!config_prof);
+ test_szind_wrapper(0);
+ test_szind_wrapper(1);
+ test_szind_wrapper(2);
+ test_szind_wrapper(SC_NBINS);
+ test_szind_wrapper(SC_NBINS + 1);
+ test_szind_wrapper(SC_NBINS + 2);
+}
+TEST_END
+
+static void
+test_szind_aligned_wrapper(szind_t ind, unsigned lg_align) {
+ size_t sizes_array[N_PTRS];
+ int flags_array[N_PTRS];
+ int flags = MALLOCX_LG_ALIGN(lg_align);
+ for (size_t i = 0, sz = sz_index2size(ind) - N_PTRS; i < N_PTRS;
+ ++i, ++sz) {
+ sizes_array[i] = sz;
+ flags_array[i] = flags;
+ }
+ test_combinations(
+ sz_size2index(sz_sa2u(sz_index2size(ind), 1 << lg_align)),
+ sizes_array, flags_array);
+}
+
+TEST_BEGIN(test_prof_stats_aligned) {
+ test_skip_if(!config_prof);
+ for (szind_t ind = 0; ind < 10; ++ind) {
+ for (unsigned lg_align = 0; lg_align < 10; ++lg_align) {
+ test_szind_aligned_wrapper(ind, lg_align);
+ }
+ }
+ for (szind_t ind = SC_NBINS - 5; ind < SC_NBINS + 5; ++ind) {
+ for (unsigned lg_align = SC_LG_LARGE_MINCLASS - 5;
+ lg_align < SC_LG_LARGE_MINCLASS + 5; ++lg_align) {
+ test_szind_aligned_wrapper(ind, lg_align);
+ }
+ }
+}
+TEST_END
+
+int
+main(void) {
+ return test(
+ test_prof_stats,
+ test_prof_stats_aligned);
+}