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