michael@0: #define JEMALLOC_MANGLE michael@0: #include "jemalloc_test.h" michael@0: michael@0: #if (LG_BITMAP_MAXBITS > 12) michael@0: # define MAXBITS 4500 michael@0: #else michael@0: # define MAXBITS (1U << LG_BITMAP_MAXBITS) michael@0: #endif michael@0: michael@0: static void michael@0: test_bitmap_size(void) michael@0: { michael@0: size_t i, prev_size; michael@0: michael@0: prev_size = 0; michael@0: for (i = 1; i <= MAXBITS; i++) { michael@0: size_t size = bitmap_size(i); michael@0: assert(size >= prev_size); michael@0: prev_size = size; michael@0: } michael@0: } michael@0: michael@0: static void michael@0: test_bitmap_init(void) michael@0: { michael@0: size_t i; michael@0: michael@0: for (i = 1; i <= MAXBITS; i++) { michael@0: bitmap_info_t binfo; michael@0: bitmap_info_init(&binfo, i); michael@0: { michael@0: size_t j; michael@0: bitmap_t *bitmap = malloc(sizeof(bitmap_t) * michael@0: bitmap_info_ngroups(&binfo)); michael@0: bitmap_init(bitmap, &binfo); michael@0: michael@0: for (j = 0; j < i; j++) michael@0: assert(bitmap_get(bitmap, &binfo, j) == false); michael@0: free(bitmap); michael@0: michael@0: } michael@0: } michael@0: } michael@0: michael@0: static void michael@0: test_bitmap_set(void) michael@0: { michael@0: size_t i; michael@0: michael@0: for (i = 1; i <= MAXBITS; i++) { michael@0: bitmap_info_t binfo; michael@0: bitmap_info_init(&binfo, i); michael@0: { michael@0: size_t j; michael@0: bitmap_t *bitmap = malloc(sizeof(bitmap_t) * michael@0: bitmap_info_ngroups(&binfo)); michael@0: bitmap_init(bitmap, &binfo); michael@0: michael@0: for (j = 0; j < i; j++) michael@0: bitmap_set(bitmap, &binfo, j); michael@0: assert(bitmap_full(bitmap, &binfo)); michael@0: free(bitmap); michael@0: } michael@0: } michael@0: } michael@0: michael@0: static void michael@0: test_bitmap_unset(void) michael@0: { michael@0: size_t i; michael@0: michael@0: for (i = 1; i <= MAXBITS; i++) { michael@0: bitmap_info_t binfo; michael@0: bitmap_info_init(&binfo, i); michael@0: { michael@0: size_t j; michael@0: bitmap_t *bitmap = malloc(sizeof(bitmap_t) * michael@0: bitmap_info_ngroups(&binfo)); michael@0: bitmap_init(bitmap, &binfo); michael@0: michael@0: for (j = 0; j < i; j++) michael@0: bitmap_set(bitmap, &binfo, j); michael@0: assert(bitmap_full(bitmap, &binfo)); michael@0: for (j = 0; j < i; j++) michael@0: bitmap_unset(bitmap, &binfo, j); michael@0: for (j = 0; j < i; j++) michael@0: bitmap_set(bitmap, &binfo, j); michael@0: assert(bitmap_full(bitmap, &binfo)); michael@0: free(bitmap); michael@0: } michael@0: } michael@0: } michael@0: michael@0: static void michael@0: test_bitmap_sfu(void) michael@0: { michael@0: size_t i; michael@0: michael@0: for (i = 1; i <= MAXBITS; i++) { michael@0: bitmap_info_t binfo; michael@0: bitmap_info_init(&binfo, i); michael@0: { michael@0: ssize_t j; michael@0: bitmap_t *bitmap = malloc(sizeof(bitmap_t) * michael@0: bitmap_info_ngroups(&binfo)); michael@0: bitmap_init(bitmap, &binfo); michael@0: michael@0: /* Iteratively set bits starting at the beginning. */ michael@0: for (j = 0; j < i; j++) michael@0: assert(bitmap_sfu(bitmap, &binfo) == j); michael@0: assert(bitmap_full(bitmap, &binfo)); michael@0: michael@0: /* michael@0: * Iteratively unset bits starting at the end, and michael@0: * verify that bitmap_sfu() reaches the unset bits. michael@0: */ michael@0: for (j = i - 1; j >= 0; j--) { michael@0: bitmap_unset(bitmap, &binfo, j); michael@0: assert(bitmap_sfu(bitmap, &binfo) == j); michael@0: bitmap_unset(bitmap, &binfo, j); michael@0: } michael@0: assert(bitmap_get(bitmap, &binfo, 0) == false); michael@0: michael@0: /* michael@0: * Iteratively set bits starting at the beginning, and michael@0: * verify that bitmap_sfu() looks past them. michael@0: */ michael@0: for (j = 1; j < i; j++) { michael@0: bitmap_set(bitmap, &binfo, j - 1); michael@0: assert(bitmap_sfu(bitmap, &binfo) == j); michael@0: bitmap_unset(bitmap, &binfo, j); michael@0: } michael@0: assert(bitmap_sfu(bitmap, &binfo) == i - 1); michael@0: assert(bitmap_full(bitmap, &binfo)); michael@0: free(bitmap); michael@0: } michael@0: } michael@0: } michael@0: michael@0: int michael@0: main(void) michael@0: { michael@0: malloc_printf("Test begin\n"); michael@0: michael@0: test_bitmap_size(); michael@0: test_bitmap_init(); michael@0: test_bitmap_set(); michael@0: test_bitmap_unset(); michael@0: test_bitmap_sfu(); michael@0: michael@0: malloc_printf("Test end\n"); michael@0: return (0); michael@0: }