Home | History | Annotate | Line # | Download | only in unit
      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