1 1.1 christos #include "test/jemalloc_test.h" 2 1.1 christos 3 1.1 christos #include "jemalloc/internal/qr.h" 4 1.1 christos 5 1.1 christos /* Number of ring entries, in [2..26]. */ 6 1.1 christos #define NENTRIES 9 7 1.1 christos /* Split index, in [1..NENTRIES). */ 8 1.1 christos #define SPLIT_INDEX 5 9 1.1 christos 10 1.1 christos typedef struct ring_s ring_t; 11 1.1 christos 12 1.1 christos struct ring_s { 13 1.1 christos qr(ring_t) link; 14 1.1 christos char id; 15 1.1 christos }; 16 1.1 christos 17 1.1 christos static void 18 1.1 christos init_entries(ring_t *entries) { 19 1.1 christos unsigned i; 20 1.1 christos 21 1.1 christos for (i = 0; i < NENTRIES; i++) { 22 1.1 christos qr_new(&entries[i], link); 23 1.1 christos entries[i].id = 'a' + i; 24 1.1 christos } 25 1.1 christos } 26 1.1 christos 27 1.1 christos static void 28 1.1 christos test_independent_entries(ring_t *entries) { 29 1.1 christos ring_t *t; 30 1.1 christos unsigned i, j; 31 1.1 christos 32 1.1 christos for (i = 0; i < NENTRIES; i++) { 33 1.1 christos j = 0; 34 1.1 christos qr_foreach(t, &entries[i], link) { 35 1.1 christos j++; 36 1.1 christos } 37 1.1.1.2 christos expect_u_eq(j, 1, 38 1.1 christos "Iteration over single-element ring should visit precisely " 39 1.1 christos "one element"); 40 1.1 christos } 41 1.1 christos for (i = 0; i < NENTRIES; i++) { 42 1.1 christos j = 0; 43 1.1 christos qr_reverse_foreach(t, &entries[i], link) { 44 1.1 christos j++; 45 1.1 christos } 46 1.1.1.2 christos expect_u_eq(j, 1, 47 1.1 christos "Iteration over single-element ring should visit precisely " 48 1.1 christos "one element"); 49 1.1 christos } 50 1.1 christos for (i = 0; i < NENTRIES; i++) { 51 1.1 christos t = qr_next(&entries[i], link); 52 1.1.1.2 christos expect_ptr_eq(t, &entries[i], 53 1.1 christos "Next element in single-element ring should be same as " 54 1.1 christos "current element"); 55 1.1 christos } 56 1.1 christos for (i = 0; i < NENTRIES; i++) { 57 1.1 christos t = qr_prev(&entries[i], link); 58 1.1.1.2 christos expect_ptr_eq(t, &entries[i], 59 1.1 christos "Previous element in single-element ring should be same as " 60 1.1 christos "current element"); 61 1.1 christos } 62 1.1 christos } 63 1.1 christos 64 1.1 christos TEST_BEGIN(test_qr_one) { 65 1.1 christos ring_t entries[NENTRIES]; 66 1.1 christos 67 1.1 christos init_entries(entries); 68 1.1 christos test_independent_entries(entries); 69 1.1 christos } 70 1.1 christos TEST_END 71 1.1 christos 72 1.1 christos static void 73 1.1 christos test_entries_ring(ring_t *entries) { 74 1.1 christos ring_t *t; 75 1.1 christos unsigned i, j; 76 1.1 christos 77 1.1 christos for (i = 0; i < NENTRIES; i++) { 78 1.1 christos j = 0; 79 1.1 christos qr_foreach(t, &entries[i], link) { 80 1.1.1.2 christos expect_c_eq(t->id, entries[(i+j) % NENTRIES].id, 81 1.1 christos "Element id mismatch"); 82 1.1 christos j++; 83 1.1 christos } 84 1.1 christos } 85 1.1 christos for (i = 0; i < NENTRIES; i++) { 86 1.1 christos j = 0; 87 1.1 christos qr_reverse_foreach(t, &entries[i], link) { 88 1.1.1.2 christos expect_c_eq(t->id, entries[(NENTRIES+i-j-1) % 89 1.1 christos NENTRIES].id, "Element id mismatch"); 90 1.1 christos j++; 91 1.1 christos } 92 1.1 christos } 93 1.1 christos for (i = 0; i < NENTRIES; i++) { 94 1.1 christos t = qr_next(&entries[i], link); 95 1.1.1.2 christos expect_c_eq(t->id, entries[(i+1) % NENTRIES].id, 96 1.1 christos "Element id mismatch"); 97 1.1 christos } 98 1.1 christos for (i = 0; i < NENTRIES; i++) { 99 1.1 christos t = qr_prev(&entries[i], link); 100 1.1.1.2 christos expect_c_eq(t->id, entries[(NENTRIES+i-1) % NENTRIES].id, 101 1.1 christos "Element id mismatch"); 102 1.1 christos } 103 1.1 christos } 104 1.1 christos 105 1.1 christos TEST_BEGIN(test_qr_after_insert) { 106 1.1 christos ring_t entries[NENTRIES]; 107 1.1 christos unsigned i; 108 1.1 christos 109 1.1 christos init_entries(entries); 110 1.1 christos for (i = 1; i < NENTRIES; i++) { 111 1.1 christos qr_after_insert(&entries[i - 1], &entries[i], link); 112 1.1 christos } 113 1.1 christos test_entries_ring(entries); 114 1.1 christos } 115 1.1 christos TEST_END 116 1.1 christos 117 1.1 christos TEST_BEGIN(test_qr_remove) { 118 1.1 christos ring_t entries[NENTRIES]; 119 1.1 christos ring_t *t; 120 1.1 christos unsigned i, j; 121 1.1 christos 122 1.1 christos init_entries(entries); 123 1.1 christos for (i = 1; i < NENTRIES; i++) { 124 1.1 christos qr_after_insert(&entries[i - 1], &entries[i], link); 125 1.1 christos } 126 1.1 christos 127 1.1 christos for (i = 0; i < NENTRIES; i++) { 128 1.1 christos j = 0; 129 1.1 christos qr_foreach(t, &entries[i], link) { 130 1.1.1.2 christos expect_c_eq(t->id, entries[i+j].id, 131 1.1 christos "Element id mismatch"); 132 1.1 christos j++; 133 1.1 christos } 134 1.1 christos j = 0; 135 1.1 christos qr_reverse_foreach(t, &entries[i], link) { 136 1.1.1.2 christos expect_c_eq(t->id, entries[NENTRIES - 1 - j].id, 137 1.1 christos "Element id mismatch"); 138 1.1 christos j++; 139 1.1 christos } 140 1.1 christos qr_remove(&entries[i], link); 141 1.1 christos } 142 1.1 christos test_independent_entries(entries); 143 1.1 christos } 144 1.1 christos TEST_END 145 1.1 christos 146 1.1 christos TEST_BEGIN(test_qr_before_insert) { 147 1.1 christos ring_t entries[NENTRIES]; 148 1.1 christos ring_t *t; 149 1.1 christos unsigned i, j; 150 1.1 christos 151 1.1 christos init_entries(entries); 152 1.1 christos for (i = 1; i < NENTRIES; i++) { 153 1.1 christos qr_before_insert(&entries[i - 1], &entries[i], link); 154 1.1 christos } 155 1.1 christos for (i = 0; i < NENTRIES; i++) { 156 1.1 christos j = 0; 157 1.1 christos qr_foreach(t, &entries[i], link) { 158 1.1.1.2 christos expect_c_eq(t->id, entries[(NENTRIES+i-j) % 159 1.1 christos NENTRIES].id, "Element id mismatch"); 160 1.1 christos j++; 161 1.1 christos } 162 1.1 christos } 163 1.1 christos for (i = 0; i < NENTRIES; i++) { 164 1.1 christos j = 0; 165 1.1 christos qr_reverse_foreach(t, &entries[i], link) { 166 1.1.1.2 christos expect_c_eq(t->id, entries[(i+j+1) % NENTRIES].id, 167 1.1 christos "Element id mismatch"); 168 1.1 christos j++; 169 1.1 christos } 170 1.1 christos } 171 1.1 christos for (i = 0; i < NENTRIES; i++) { 172 1.1 christos t = qr_next(&entries[i], link); 173 1.1.1.2 christos expect_c_eq(t->id, entries[(NENTRIES+i-1) % NENTRIES].id, 174 1.1 christos "Element id mismatch"); 175 1.1 christos } 176 1.1 christos for (i = 0; i < NENTRIES; i++) { 177 1.1 christos t = qr_prev(&entries[i], link); 178 1.1.1.2 christos expect_c_eq(t->id, entries[(i+1) % NENTRIES].id, 179 1.1 christos "Element id mismatch"); 180 1.1 christos } 181 1.1 christos } 182 1.1 christos TEST_END 183 1.1 christos 184 1.1 christos static void 185 1.1 christos test_split_entries(ring_t *entries) { 186 1.1 christos ring_t *t; 187 1.1 christos unsigned i, j; 188 1.1 christos 189 1.1 christos for (i = 0; i < NENTRIES; i++) { 190 1.1 christos j = 0; 191 1.1 christos qr_foreach(t, &entries[i], link) { 192 1.1 christos if (i < SPLIT_INDEX) { 193 1.1.1.2 christos expect_c_eq(t->id, 194 1.1 christos entries[(i+j) % SPLIT_INDEX].id, 195 1.1 christos "Element id mismatch"); 196 1.1 christos } else { 197 1.1.1.2 christos expect_c_eq(t->id, entries[(i+j-SPLIT_INDEX) % 198 1.1 christos (NENTRIES-SPLIT_INDEX) + SPLIT_INDEX].id, 199 1.1 christos "Element id mismatch"); 200 1.1 christos } 201 1.1 christos j++; 202 1.1 christos } 203 1.1 christos } 204 1.1 christos } 205 1.1 christos 206 1.1 christos TEST_BEGIN(test_qr_meld_split) { 207 1.1 christos ring_t entries[NENTRIES]; 208 1.1 christos unsigned i; 209 1.1 christos 210 1.1 christos init_entries(entries); 211 1.1 christos for (i = 1; i < NENTRIES; i++) { 212 1.1 christos qr_after_insert(&entries[i - 1], &entries[i], link); 213 1.1 christos } 214 1.1 christos 215 1.1.1.2 christos qr_split(&entries[0], &entries[SPLIT_INDEX], link); 216 1.1 christos test_split_entries(entries); 217 1.1 christos 218 1.1.1.2 christos qr_meld(&entries[0], &entries[SPLIT_INDEX], link); 219 1.1 christos test_entries_ring(entries); 220 1.1 christos 221 1.1.1.2 christos qr_meld(&entries[0], &entries[SPLIT_INDEX], link); 222 1.1 christos test_split_entries(entries); 223 1.1 christos 224 1.1.1.2 christos qr_split(&entries[0], &entries[SPLIT_INDEX], link); 225 1.1 christos test_entries_ring(entries); 226 1.1 christos 227 1.1.1.2 christos qr_split(&entries[0], &entries[0], link); 228 1.1 christos test_entries_ring(entries); 229 1.1 christos 230 1.1.1.2 christos qr_meld(&entries[0], &entries[0], link); 231 1.1 christos test_entries_ring(entries); 232 1.1 christos } 233 1.1 christos TEST_END 234 1.1 christos 235 1.1 christos int 236 1.1 christos main(void) { 237 1.1 christos return test( 238 1.1 christos test_qr_one, 239 1.1 christos test_qr_after_insert, 240 1.1 christos test_qr_remove, 241 1.1 christos test_qr_before_insert, 242 1.1 christos test_qr_meld_split); 243 1.1 christos } 244