d9f7e6c668
We're about to make the functionality here more complicated; testing hpdata directly (rather than relying on user's tests) will make debugging easier.
62 lines
2.1 KiB
C
62 lines
2.1 KiB
C
#include "test/jemalloc_test.h"
|
|
|
|
#define HPDATA_ADDR ((void *)(10 * HUGEPAGE))
|
|
#define HPDATA_AGE 123
|
|
|
|
TEST_BEGIN(test_reserve_alloc) {
|
|
hpdata_t hpdata;
|
|
hpdata_init(&hpdata, HPDATA_ADDR, HPDATA_AGE);
|
|
|
|
/* Allocating a page at a time, we should do first fit. */
|
|
for (size_t i = 0; i < HUGEPAGE_PAGES; i++) {
|
|
expect_true(hpdata_consistent(&hpdata), "");
|
|
expect_zu_eq(HUGEPAGE_PAGES - i,
|
|
hpdata_longest_free_range_get(&hpdata), "");
|
|
void *alloc = hpdata_reserve_alloc(&hpdata, PAGE);
|
|
expect_ptr_eq((char *)HPDATA_ADDR + i * PAGE, alloc, "");
|
|
expect_true(hpdata_consistent(&hpdata), "");
|
|
}
|
|
expect_true(hpdata_consistent(&hpdata), "");
|
|
expect_zu_eq(0, hpdata_longest_free_range_get(&hpdata), "");
|
|
|
|
/*
|
|
* Build up a bigger free-range, 2 pages at a time, until we've got 6
|
|
* adjacent free pages total. Pages 8-13 should be unreserved after
|
|
* this.
|
|
*/
|
|
hpdata_unreserve(&hpdata, (char *)HPDATA_ADDR + 10 * PAGE, 2 * PAGE);
|
|
expect_true(hpdata_consistent(&hpdata), "");
|
|
expect_zu_eq(2, hpdata_longest_free_range_get(&hpdata), "");
|
|
|
|
hpdata_unreserve(&hpdata, (char *)HPDATA_ADDR + 12 * PAGE, 2 * PAGE);
|
|
expect_true(hpdata_consistent(&hpdata), "");
|
|
expect_zu_eq(4, hpdata_longest_free_range_get(&hpdata), "");
|
|
|
|
hpdata_unreserve(&hpdata, (char *)HPDATA_ADDR + 8 * PAGE, 2 * PAGE);
|
|
expect_true(hpdata_consistent(&hpdata), "");
|
|
expect_zu_eq(6, hpdata_longest_free_range_get(&hpdata), "");
|
|
|
|
/*
|
|
* Leave page 14 reserved, but free page 15 (this test the case where
|
|
* unreserving combines two ranges).
|
|
*/
|
|
hpdata_unreserve(&hpdata, (char *)HPDATA_ADDR + 15 * PAGE, PAGE);
|
|
/*
|
|
* Longest free range shouldn't change; we've got a free range of size
|
|
* 6, then a reserved page, then another free range.
|
|
*/
|
|
expect_true(hpdata_consistent(&hpdata), "");
|
|
expect_zu_eq(6, hpdata_longest_free_range_get(&hpdata), "");
|
|
|
|
/* After freeing page 14, the two ranges get combined. */
|
|
hpdata_unreserve(&hpdata, (char *)HPDATA_ADDR + 14 * PAGE, PAGE);
|
|
expect_true(hpdata_consistent(&hpdata), "");
|
|
expect_zu_eq(8, hpdata_longest_free_range_get(&hpdata), "");
|
|
}
|
|
TEST_END
|
|
|
|
int main(void) {
|
|
return test_no_reentrancy(
|
|
test_reserve_alloc);
|
|
}
|