1981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans#include "test/jemalloc_test.h" 2981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans 3981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans/* Number of ring entries, in [2..26]. */ 4981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans#define NENTRIES 9 5981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans 6981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evanstypedef struct list_s list_t; 7981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evanstypedef ql_head(list_t) list_head_t; 8981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans 9981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evansstruct list_s { 10981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans ql_elm(list_t) link; 11981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans char id; 12981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans}; 13981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans 14981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evansstatic void 15981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evanstest_empty_list(list_head_t *head) 16981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans{ 17981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans list_t *t; 18981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans unsigned i; 19981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans 20981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans assert_ptr_null(ql_first(head), "Unexpected element for empty list"); 21981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans assert_ptr_null(ql_last(head, link), 22981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans "Unexpected element for empty list"); 23981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans 24981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans i = 0; 25981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans ql_foreach(t, head, link) { 26981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans i++; 27981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans } 28981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans assert_u_eq(i, 0, "Unexpected element for empty list"); 29981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans 30981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans i = 0; 31981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans ql_reverse_foreach(t, head, link) { 32981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans i++; 33981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans } 34981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans assert_u_eq(i, 0, "Unexpected element for empty list"); 35981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans} 36981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans 37981bb499d92fee940d5be79cec3abdd3de3891b8Jason EvansTEST_BEGIN(test_ql_empty) 38981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans{ 39981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans list_head_t head; 40981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans 41981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans ql_new(&head); 42981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans test_empty_list(&head); 43981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans} 44981bb499d92fee940d5be79cec3abdd3de3891b8Jason EvansTEST_END 45981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans 46981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evansstatic void 47981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evansinit_entries(list_t *entries, unsigned nentries) 48981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans{ 49981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans unsigned i; 50981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans 51981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans for (i = 0; i < nentries; i++) { 52981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans entries[i].id = 'a' + i; 53981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans ql_elm_new(&entries[i], link); 54981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans } 55981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans} 56981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans 57981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evansstatic void 58981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evanstest_entries_list(list_head_t *head, list_t *entries, unsigned nentries) 59981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans{ 60981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans list_t *t; 61981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans unsigned i; 62981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans 63981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans assert_c_eq(ql_first(head)->id, entries[0].id, "Element id mismatch"); 64981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans assert_c_eq(ql_last(head, link)->id, entries[nentries-1].id, 65981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans "Element id mismatch"); 66981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans 67981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans i = 0; 68981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans ql_foreach(t, head, link) { 69981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans assert_c_eq(t->id, entries[i].id, "Element id mismatch"); 70981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans i++; 71981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans } 72981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans 73981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans i = 0; 74981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans ql_reverse_foreach(t, head, link) { 75981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans assert_c_eq(t->id, entries[nentries-i-1].id, 76981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans "Element id mismatch"); 77981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans i++; 78981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans } 79981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans 80981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans for (i = 0; i < nentries-1; i++) { 81981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans t = ql_next(head, &entries[i], link); 82981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans assert_c_eq(t->id, entries[i+1].id, "Element id mismatch"); 83981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans } 84981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans assert_ptr_null(ql_next(head, &entries[nentries-1], link), 85981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans "Unexpected element"); 86981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans 87981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans assert_ptr_null(ql_prev(head, &entries[0], link), "Unexpected element"); 88981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans for (i = 1; i < nentries; i++) { 89981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans t = ql_prev(head, &entries[i], link); 90981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans assert_c_eq(t->id, entries[i-1].id, "Element id mismatch"); 91981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans } 92981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans} 93981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans 94981bb499d92fee940d5be79cec3abdd3de3891b8Jason EvansTEST_BEGIN(test_ql_tail_insert) 95981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans{ 96981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans list_head_t head; 97981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans list_t entries[NENTRIES]; 98981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans unsigned i; 99981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans 100981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans ql_new(&head); 101981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans init_entries(entries, sizeof(entries)/sizeof(list_t)); 102981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans for (i = 0; i < NENTRIES; i++) 103981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans ql_tail_insert(&head, &entries[i], link); 104981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans 105981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans test_entries_list(&head, entries, NENTRIES); 106981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans} 107981bb499d92fee940d5be79cec3abdd3de3891b8Jason EvansTEST_END 108981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans 109981bb499d92fee940d5be79cec3abdd3de3891b8Jason EvansTEST_BEGIN(test_ql_tail_remove) 110981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans{ 111981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans list_head_t head; 112981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans list_t entries[NENTRIES]; 113981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans unsigned i; 114981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans 115981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans ql_new(&head); 116981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans init_entries(entries, sizeof(entries)/sizeof(list_t)); 117981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans for (i = 0; i < NENTRIES; i++) 118981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans ql_tail_insert(&head, &entries[i], link); 119981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans 120981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans for (i = 0; i < NENTRIES; i++) { 121981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans test_entries_list(&head, entries, NENTRIES-i); 122981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans ql_tail_remove(&head, list_t, link); 123981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans } 124981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans test_empty_list(&head); 125981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans} 126981bb499d92fee940d5be79cec3abdd3de3891b8Jason EvansTEST_END 127981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans 128981bb499d92fee940d5be79cec3abdd3de3891b8Jason EvansTEST_BEGIN(test_ql_head_insert) 129981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans{ 130981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans list_head_t head; 131981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans list_t entries[NENTRIES]; 132981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans unsigned i; 133981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans 134981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans ql_new(&head); 135981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans init_entries(entries, sizeof(entries)/sizeof(list_t)); 136981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans for (i = 0; i < NENTRIES; i++) 137981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans ql_head_insert(&head, &entries[NENTRIES-i-1], link); 138981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans 139981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans test_entries_list(&head, entries, NENTRIES); 140981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans} 141981bb499d92fee940d5be79cec3abdd3de3891b8Jason EvansTEST_END 142981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans 143981bb499d92fee940d5be79cec3abdd3de3891b8Jason EvansTEST_BEGIN(test_ql_head_remove) 144981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans{ 145981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans list_head_t head; 146981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans list_t entries[NENTRIES]; 147981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans unsigned i; 148981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans 149981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans ql_new(&head); 150981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans init_entries(entries, sizeof(entries)/sizeof(list_t)); 151981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans for (i = 0; i < NENTRIES; i++) 152981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans ql_head_insert(&head, &entries[NENTRIES-i-1], link); 153981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans 154981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans for (i = 0; i < NENTRIES; i++) { 155981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans test_entries_list(&head, &entries[i], NENTRIES-i); 156981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans ql_head_remove(&head, list_t, link); 157981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans } 158981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans test_empty_list(&head); 159981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans} 160981bb499d92fee940d5be79cec3abdd3de3891b8Jason EvansTEST_END 161981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans 162981bb499d92fee940d5be79cec3abdd3de3891b8Jason EvansTEST_BEGIN(test_ql_insert) 163981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans{ 164981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans list_head_t head; 165981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans list_t entries[8]; 166981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans list_t *a, *b, *c, *d, *e, *f, *g, *h; 167981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans 168981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans ql_new(&head); 169981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans init_entries(entries, sizeof(entries)/sizeof(list_t)); 170981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans a = &entries[0]; 171981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans b = &entries[1]; 172981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans c = &entries[2]; 173981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans d = &entries[3]; 174981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans e = &entries[4]; 175981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans f = &entries[5]; 176981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans g = &entries[6]; 177981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans h = &entries[7]; 178981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans 179981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans /* 180981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans * ql_remove(), ql_before_insert(), and ql_after_insert() are used 181981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans * internally by other macros that are already tested, so there's no 182981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans * need to test them completely. However, insertion/deletion from the 183981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans * middle of lists is not otherwise tested; do so here. 184981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans */ 185981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans ql_tail_insert(&head, f, link); 186981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans ql_before_insert(&head, f, b, link); 187981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans ql_before_insert(&head, f, c, link); 188981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans ql_after_insert(f, h, link); 189981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans ql_after_insert(f, g, link); 190981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans ql_before_insert(&head, b, a, link); 191981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans ql_after_insert(c, d, link); 192981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans ql_before_insert(&head, f, e, link); 193981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans 194981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans test_entries_list(&head, entries, sizeof(entries)/sizeof(list_t)); 195981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans} 196981bb499d92fee940d5be79cec3abdd3de3891b8Jason EvansTEST_END 197981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans 198981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evansint 199981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evansmain(void) 200981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans{ 201981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans 202981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans return (test( 203981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans test_ql_empty, 204981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans test_ql_tail_insert, 205981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans test_ql_tail_remove, 206981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans test_ql_head_insert, 207981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans test_ql_head_remove, 208981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans test_ql_insert)); 209981bb499d92fee940d5be79cec3abdd3de3891b8Jason Evans} 210