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