#define JEMALLOC_MANGLE #include "jemalloc_test.h" /* * Avoid using the assert() from jemalloc_internal.h, since it requires * internal libjemalloc functionality. * */ #include /* * Directly include the bitmap code, since it isn't exposed outside * libjemalloc. */ #include "../src/bitmap.c" #if (LG_BITMAP_MAXBITS > 12) # define MAXBITS 4500 #else # define MAXBITS (1U << LG_BITMAP_MAXBITS) #endif static void test_bitmap_size(void) { size_t i, prev_size; prev_size = 0; for (i = 1; i <= MAXBITS; i++) { size_t size = bitmap_size(i); assert(size >= prev_size); prev_size = size; } } static void test_bitmap_init(void) { size_t i; for (i = 1; i <= MAXBITS; i++) { bitmap_info_t binfo; bitmap_info_init(&binfo, i); { size_t j; bitmap_t bitmap[bitmap_info_ngroups(&binfo)]; bitmap_init(bitmap, &binfo); for (j = 0; j < i; j++) assert(bitmap_get(bitmap, &binfo, j) == false); } } } static void test_bitmap_set(void) { size_t i; for (i = 1; i <= MAXBITS; i++) { bitmap_info_t binfo; bitmap_info_init(&binfo, i); { size_t j; bitmap_t bitmap[bitmap_info_ngroups(&binfo)]; bitmap_init(bitmap, &binfo); for (j = 0; j < i; j++) bitmap_set(bitmap, &binfo, j); assert(bitmap_full(bitmap, &binfo)); } } } static void test_bitmap_unset(void) { size_t i; for (i = 1; i <= MAXBITS; i++) { bitmap_info_t binfo; bitmap_info_init(&binfo, i); { size_t j; bitmap_t bitmap[bitmap_info_ngroups(&binfo)]; bitmap_init(bitmap, &binfo); for (j = 0; j < i; j++) bitmap_set(bitmap, &binfo, j); assert(bitmap_full(bitmap, &binfo)); for (j = 0; j < i; j++) bitmap_unset(bitmap, &binfo, j); for (j = 0; j < i; j++) bitmap_set(bitmap, &binfo, j); assert(bitmap_full(bitmap, &binfo)); } } } static void test_bitmap_sfu(void) { size_t i; for (i = 1; i <= MAXBITS; i++) { bitmap_info_t binfo; bitmap_info_init(&binfo, i); { ssize_t j; bitmap_t bitmap[bitmap_info_ngroups(&binfo)]; bitmap_init(bitmap, &binfo); /* Iteratively set bits starting at the beginning. */ for (j = 0; j < i; j++) assert(bitmap_sfu(bitmap, &binfo) == j); assert(bitmap_full(bitmap, &binfo)); /* * Iteratively unset bits starting at the end, and * verify that bitmap_sfu() reaches the unset bits. */ for (j = i - 1; j >= 0; j--) { bitmap_unset(bitmap, &binfo, j); assert(bitmap_sfu(bitmap, &binfo) == j); bitmap_unset(bitmap, &binfo, j); } assert(bitmap_get(bitmap, &binfo, 0) == false); /* * Iteratively set bits starting at the beginning, and * verify that bitmap_sfu() looks past them. */ for (j = 1; j < i; j++) { bitmap_set(bitmap, &binfo, j - 1); assert(bitmap_sfu(bitmap, &binfo) == j); bitmap_unset(bitmap, &binfo, j); } assert(bitmap_sfu(bitmap, &binfo) == i - 1); assert(bitmap_full(bitmap, &binfo)); } } } int main(void) { fprintf(stderr, "Test begin\n"); test_bitmap_size(); test_bitmap_init(); test_bitmap_set(); test_bitmap_unset(); test_bitmap_sfu(); fprintf(stderr, "Test end\n"); return (0); }