bitmap.c revision 86abd0dcd8e478759fe409d338d11558c4cec427
1#include "test/jemalloc_test.h" 2 3#if (LG_BITMAP_MAXBITS > 12) 4# define MAXBITS 4500 5#else 6# define MAXBITS (1U << LG_BITMAP_MAXBITS) 7#endif 8 9static void 10test_bitmap_size(void) 11{ 12 size_t i, prev_size; 13 14 prev_size = 0; 15 for (i = 1; i <= MAXBITS; i++) { 16 size_t size = bitmap_size(i); 17 assert(size >= prev_size); 18 prev_size = size; 19 } 20} 21 22static void 23test_bitmap_init(void) 24{ 25 size_t i; 26 27 for (i = 1; i <= MAXBITS; i++) { 28 bitmap_info_t binfo; 29 bitmap_info_init(&binfo, i); 30 { 31 size_t j; 32 bitmap_t *bitmap = malloc(sizeof(bitmap_t) * 33 bitmap_info_ngroups(&binfo)); 34 bitmap_init(bitmap, &binfo); 35 36 for (j = 0; j < i; j++) 37 assert(bitmap_get(bitmap, &binfo, j) == false); 38 free(bitmap); 39 } 40 } 41} 42 43static void 44test_bitmap_set(void) 45{ 46 size_t i; 47 48 for (i = 1; i <= MAXBITS; i++) { 49 bitmap_info_t binfo; 50 bitmap_info_init(&binfo, i); 51 { 52 size_t j; 53 bitmap_t *bitmap = malloc(sizeof(bitmap_t) * 54 bitmap_info_ngroups(&binfo)); 55 bitmap_init(bitmap, &binfo); 56 57 for (j = 0; j < i; j++) 58 bitmap_set(bitmap, &binfo, j); 59 assert(bitmap_full(bitmap, &binfo)); 60 free(bitmap); 61 } 62 } 63} 64 65static void 66test_bitmap_unset(void) 67{ 68 size_t i; 69 70 for (i = 1; i <= MAXBITS; i++) { 71 bitmap_info_t binfo; 72 bitmap_info_init(&binfo, i); 73 { 74 size_t j; 75 bitmap_t *bitmap = malloc(sizeof(bitmap_t) * 76 bitmap_info_ngroups(&binfo)); 77 bitmap_init(bitmap, &binfo); 78 79 for (j = 0; j < i; j++) 80 bitmap_set(bitmap, &binfo, j); 81 assert(bitmap_full(bitmap, &binfo)); 82 for (j = 0; j < i; j++) 83 bitmap_unset(bitmap, &binfo, j); 84 for (j = 0; j < i; j++) 85 bitmap_set(bitmap, &binfo, j); 86 assert(bitmap_full(bitmap, &binfo)); 87 free(bitmap); 88 } 89 } 90} 91 92static void 93test_bitmap_sfu(void) 94{ 95 size_t i; 96 97 for (i = 1; i <= MAXBITS; i++) { 98 bitmap_info_t binfo; 99 bitmap_info_init(&binfo, i); 100 { 101 ssize_t j; 102 bitmap_t *bitmap = malloc(sizeof(bitmap_t) * 103 bitmap_info_ngroups(&binfo)); 104 bitmap_init(bitmap, &binfo); 105 106 /* Iteratively set bits starting at the beginning. */ 107 for (j = 0; j < i; j++) 108 assert(bitmap_sfu(bitmap, &binfo) == j); 109 assert(bitmap_full(bitmap, &binfo)); 110 111 /* 112 * Iteratively unset bits starting at the end, and 113 * verify that bitmap_sfu() reaches the unset bits. 114 */ 115 for (j = i - 1; j >= 0; j--) { 116 bitmap_unset(bitmap, &binfo, j); 117 assert(bitmap_sfu(bitmap, &binfo) == j); 118 bitmap_unset(bitmap, &binfo, j); 119 } 120 assert(bitmap_get(bitmap, &binfo, 0) == false); 121 122 /* 123 * Iteratively set bits starting at the beginning, and 124 * verify that bitmap_sfu() looks past them. 125 */ 126 for (j = 1; j < i; j++) { 127 bitmap_set(bitmap, &binfo, j - 1); 128 assert(bitmap_sfu(bitmap, &binfo) == j); 129 bitmap_unset(bitmap, &binfo, j); 130 } 131 assert(bitmap_sfu(bitmap, &binfo) == i - 1); 132 assert(bitmap_full(bitmap, &binfo)); 133 free(bitmap); 134 } 135 } 136} 137 138int 139main(void) 140{ 141 malloc_printf("Test begin\n"); 142 143 test_bitmap_size(); 144 test_bitmap_init(); 145 test_bitmap_set(); 146 test_bitmap_unset(); 147 test_bitmap_sfu(); 148 149 malloc_printf("Test end\n"); 150 return (0); 151} 152