xref: /netbsd-src/external/bsd/jemalloc.old/dist/test/unit/qr.c (revision 8e33eff89e26cf71871ead62f0d5063e1313c33a)
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