xref: /aosp_15_r20/external/libwebsockets/minimal-examples/api-tests/api-test-lws_dsh/main.c (revision 1c60b9aca93fdbc9b5f19b2d2194c91294b22281)
1*1c60b9acSAndroid Build Coastguard Worker /*
2*1c60b9acSAndroid Build Coastguard Worker  * lws-api-test-lws_dsh
3*1c60b9acSAndroid Build Coastguard Worker  *
4*1c60b9acSAndroid Build Coastguard Worker  * Written in 2010-2021 by Andy Green <[email protected]>
5*1c60b9acSAndroid Build Coastguard Worker  *
6*1c60b9acSAndroid Build Coastguard Worker  * This file is made available under the Creative Commons CC0 1.0
7*1c60b9acSAndroid Build Coastguard Worker  * Universal Public Domain Dedication.
8*1c60b9acSAndroid Build Coastguard Worker  */
9*1c60b9acSAndroid Build Coastguard Worker 
10*1c60b9acSAndroid Build Coastguard Worker #include <libwebsockets.h>
11*1c60b9acSAndroid Build Coastguard Worker 
12*1c60b9acSAndroid Build Coastguard Worker int
test1(void)13*1c60b9acSAndroid Build Coastguard Worker test1(void)
14*1c60b9acSAndroid Build Coastguard Worker {
15*1c60b9acSAndroid Build Coastguard Worker 	struct lws_dsh *dsh;
16*1c60b9acSAndroid Build Coastguard Worker 	size_t size;
17*1c60b9acSAndroid Build Coastguard Worker 	void *a1;
18*1c60b9acSAndroid Build Coastguard Worker 
19*1c60b9acSAndroid Build Coastguard Worker 	/*
20*1c60b9acSAndroid Build Coastguard Worker 	 * test 1: single dsh, alloc 2 kinds and free everything back to a
21*1c60b9acSAndroid Build Coastguard Worker 	 *         single free obj
22*1c60b9acSAndroid Build Coastguard Worker 	 */
23*1c60b9acSAndroid Build Coastguard Worker 
24*1c60b9acSAndroid Build Coastguard Worker 	dsh = lws_dsh_create(NULL, 16384, 2);
25*1c60b9acSAndroid Build Coastguard Worker 	if (!dsh) {
26*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("%s: Failed to create dsh\n", __func__);
27*1c60b9acSAndroid Build Coastguard Worker 
28*1c60b9acSAndroid Build Coastguard Worker 		return 1;
29*1c60b9acSAndroid Build Coastguard Worker 	}
30*1c60b9acSAndroid Build Coastguard Worker 
31*1c60b9acSAndroid Build Coastguard Worker 	if (lws_dsh_alloc_tail(dsh, 0, "hello", 5, NULL, 0)) {
32*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("%s: Failed to alloc 1\n", __func__);
33*1c60b9acSAndroid Build Coastguard Worker 
34*1c60b9acSAndroid Build Coastguard Worker 		goto bail;
35*1c60b9acSAndroid Build Coastguard Worker 	}
36*1c60b9acSAndroid Build Coastguard Worker 
37*1c60b9acSAndroid Build Coastguard Worker 	if (lws_dsh_alloc_tail(dsh, 1, "some other string", 17, NULL, 0)) {
38*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("%s: Failed to alloc 2\n", __func__);
39*1c60b9acSAndroid Build Coastguard Worker 
40*1c60b9acSAndroid Build Coastguard Worker 		goto bail;
41*1c60b9acSAndroid Build Coastguard Worker 	}
42*1c60b9acSAndroid Build Coastguard Worker 
43*1c60b9acSAndroid Build Coastguard Worker 	if (lws_dsh_alloc_tail(dsh, 0, "hello again", 11, NULL, 0)) {
44*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("%s: Failed to alloc 3\n", __func__);
45*1c60b9acSAndroid Build Coastguard Worker 
46*1c60b9acSAndroid Build Coastguard Worker 		goto bail;
47*1c60b9acSAndroid Build Coastguard Worker 	}
48*1c60b9acSAndroid Build Coastguard Worker 
49*1c60b9acSAndroid Build Coastguard Worker 	if (lws_dsh_get_head(dsh, 1, &a1, &size)) {
50*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("%s: no head 1\n", __func__);
51*1c60b9acSAndroid Build Coastguard Worker 
52*1c60b9acSAndroid Build Coastguard Worker 		goto bail;
53*1c60b9acSAndroid Build Coastguard Worker 	}
54*1c60b9acSAndroid Build Coastguard Worker 	if (size != 17 || memcmp(a1, "some other string", 17)) {
55*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("%s: test 1 mismatch\n", __func__);
56*1c60b9acSAndroid Build Coastguard Worker 
57*1c60b9acSAndroid Build Coastguard Worker 		goto bail;
58*1c60b9acSAndroid Build Coastguard Worker 	}
59*1c60b9acSAndroid Build Coastguard Worker 	lws_dsh_free(&a1);
60*1c60b9acSAndroid Build Coastguard Worker 
61*1c60b9acSAndroid Build Coastguard Worker 	if (lws_dsh_get_head(dsh, 0, &a1, &size)) {
62*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("%s: no head 2\n", __func__);
63*1c60b9acSAndroid Build Coastguard Worker 
64*1c60b9acSAndroid Build Coastguard Worker 		goto bail;
65*1c60b9acSAndroid Build Coastguard Worker 	}
66*1c60b9acSAndroid Build Coastguard Worker 	if (size != 5 || memcmp(a1, "hello", 5)) {
67*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("%s: test 2 mismatch\n", __func__);
68*1c60b9acSAndroid Build Coastguard Worker 
69*1c60b9acSAndroid Build Coastguard Worker 		goto bail;
70*1c60b9acSAndroid Build Coastguard Worker 	}
71*1c60b9acSAndroid Build Coastguard Worker 	lws_dsh_free(&a1);
72*1c60b9acSAndroid Build Coastguard Worker 
73*1c60b9acSAndroid Build Coastguard Worker 	if (lws_dsh_get_head(dsh, 0, &a1, &size)) {
74*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("%s: no head 3\n", __func__);
75*1c60b9acSAndroid Build Coastguard Worker 
76*1c60b9acSAndroid Build Coastguard Worker 		goto bail;
77*1c60b9acSAndroid Build Coastguard Worker 	}
78*1c60b9acSAndroid Build Coastguard Worker 	if (size != 11 || memcmp(a1, "hello again", 11)) {
79*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("%s: test 3 mismatch\n", __func__);
80*1c60b9acSAndroid Build Coastguard Worker 
81*1c60b9acSAndroid Build Coastguard Worker 		goto bail;
82*1c60b9acSAndroid Build Coastguard Worker 	}
83*1c60b9acSAndroid Build Coastguard Worker 	lws_dsh_free(&a1);
84*1c60b9acSAndroid Build Coastguard Worker 
85*1c60b9acSAndroid Build Coastguard Worker 	lws_dsh_destroy(&dsh);
86*1c60b9acSAndroid Build Coastguard Worker 
87*1c60b9acSAndroid Build Coastguard Worker 	return 0;
88*1c60b9acSAndroid Build Coastguard Worker bail:
89*1c60b9acSAndroid Build Coastguard Worker 	lws_dsh_destroy(&dsh);
90*1c60b9acSAndroid Build Coastguard Worker 
91*1c60b9acSAndroid Build Coastguard Worker 	return 1;
92*1c60b9acSAndroid Build Coastguard Worker }
93*1c60b9acSAndroid Build Coastguard Worker 
94*1c60b9acSAndroid Build Coastguard Worker int
test3(void)95*1c60b9acSAndroid Build Coastguard Worker test3(void)
96*1c60b9acSAndroid Build Coastguard Worker {
97*1c60b9acSAndroid Build Coastguard Worker 	struct lws_dsh *dsh, *dsh2;
98*1c60b9acSAndroid Build Coastguard Worker 	lws_dll2_owner_t owner;
99*1c60b9acSAndroid Build Coastguard Worker 	uint8_t blob[4096];
100*1c60b9acSAndroid Build Coastguard Worker 
101*1c60b9acSAndroid Build Coastguard Worker 	memset(blob, 0, sizeof(blob));
102*1c60b9acSAndroid Build Coastguard Worker 
103*1c60b9acSAndroid Build Coastguard Worker 	/*
104*1c60b9acSAndroid Build Coastguard Worker 	 * test 3: multiple dsh, umeetable allocation request
105*1c60b9acSAndroid Build Coastguard Worker 	 */
106*1c60b9acSAndroid Build Coastguard Worker 
107*1c60b9acSAndroid Build Coastguard Worker 	lws_dll2_owner_clear(&owner);
108*1c60b9acSAndroid Build Coastguard Worker 
109*1c60b9acSAndroid Build Coastguard Worker 	dsh = lws_dsh_create(&owner, 4096, 2);
110*1c60b9acSAndroid Build Coastguard Worker 	if (!dsh) {
111*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("%s: Failed to create dsh1\n", __func__);
112*1c60b9acSAndroid Build Coastguard Worker 
113*1c60b9acSAndroid Build Coastguard Worker 		return 1;
114*1c60b9acSAndroid Build Coastguard Worker 	}
115*1c60b9acSAndroid Build Coastguard Worker 
116*1c60b9acSAndroid Build Coastguard Worker 	dsh2 = lws_dsh_create(&owner, 4096, 2);
117*1c60b9acSAndroid Build Coastguard Worker 	if (!dsh2) {
118*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("%s: Failed to create dsh2\n", __func__);
119*1c60b9acSAndroid Build Coastguard Worker 
120*1c60b9acSAndroid Build Coastguard Worker 		goto bail;
121*1c60b9acSAndroid Build Coastguard Worker 	}
122*1c60b9acSAndroid Build Coastguard Worker 
123*1c60b9acSAndroid Build Coastguard Worker 	if (lws_dsh_alloc_tail(dsh, 0, blob, 4000, NULL, 0)) {
124*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("%s: Failed to alloc 1\n", __func__);
125*1c60b9acSAndroid Build Coastguard Worker 
126*1c60b9acSAndroid Build Coastguard Worker 		goto bail2;
127*1c60b9acSAndroid Build Coastguard Worker 	}
128*1c60b9acSAndroid Build Coastguard Worker 
129*1c60b9acSAndroid Build Coastguard Worker 	if (lws_dsh_alloc_tail(dsh2, 0, "hello", 5, NULL, 0)) {
130*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("%s: Failed to alloc 2\n", __func__);
131*1c60b9acSAndroid Build Coastguard Worker 
132*1c60b9acSAndroid Build Coastguard Worker 		goto bail2;
133*1c60b9acSAndroid Build Coastguard Worker 	}
134*1c60b9acSAndroid Build Coastguard Worker 
135*1c60b9acSAndroid Build Coastguard Worker 	/*
136*1c60b9acSAndroid Build Coastguard Worker 	 * There's just no room for this, we expect it to fail
137*1c60b9acSAndroid Build Coastguard Worker 	 */
138*1c60b9acSAndroid Build Coastguard Worker 
139*1c60b9acSAndroid Build Coastguard Worker 	if (!lws_dsh_alloc_tail(dsh, 0, blob, 5000, NULL, 0)) {
140*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("%s: Didn't fail to alloc as expected\n", __func__);
141*1c60b9acSAndroid Build Coastguard Worker 
142*1c60b9acSAndroid Build Coastguard Worker 		goto bail2;
143*1c60b9acSAndroid Build Coastguard Worker 	}
144*1c60b9acSAndroid Build Coastguard Worker 
145*1c60b9acSAndroid Build Coastguard Worker 	if (lws_dsh_alloc_tail(dsh2, 0, "hello again", 11, NULL, 0)) {
146*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("%s: Failed to alloc 4\n", __func__);
147*1c60b9acSAndroid Build Coastguard Worker 
148*1c60b9acSAndroid Build Coastguard Worker 		goto bail2;
149*1c60b9acSAndroid Build Coastguard Worker 	}
150*1c60b9acSAndroid Build Coastguard Worker 
151*1c60b9acSAndroid Build Coastguard Worker 	lws_dsh_destroy(&dsh2);
152*1c60b9acSAndroid Build Coastguard Worker 	lws_dsh_destroy(&dsh);
153*1c60b9acSAndroid Build Coastguard Worker 
154*1c60b9acSAndroid Build Coastguard Worker 	return 0;
155*1c60b9acSAndroid Build Coastguard Worker 
156*1c60b9acSAndroid Build Coastguard Worker bail2:
157*1c60b9acSAndroid Build Coastguard Worker 	lws_dsh_destroy(&dsh2);
158*1c60b9acSAndroid Build Coastguard Worker 
159*1c60b9acSAndroid Build Coastguard Worker bail:
160*1c60b9acSAndroid Build Coastguard Worker 	lws_dsh_destroy(&dsh);
161*1c60b9acSAndroid Build Coastguard Worker 
162*1c60b9acSAndroid Build Coastguard Worker 	return 1;
163*1c60b9acSAndroid Build Coastguard Worker }
164*1c60b9acSAndroid Build Coastguard Worker 
165*1c60b9acSAndroid Build Coastguard Worker int
test4(void)166*1c60b9acSAndroid Build Coastguard Worker test4(void)
167*1c60b9acSAndroid Build Coastguard Worker {
168*1c60b9acSAndroid Build Coastguard Worker 	uint8_t blob[4096];
169*1c60b9acSAndroid Build Coastguard Worker 	struct lws_dsh *dsh;
170*1c60b9acSAndroid Build Coastguard Worker 	size_t size;
171*1c60b9acSAndroid Build Coastguard Worker 	void *a1;
172*1c60b9acSAndroid Build Coastguard Worker 
173*1c60b9acSAndroid Build Coastguard Worker 	memset(blob, 0, sizeof(blob));
174*1c60b9acSAndroid Build Coastguard Worker 
175*1c60b9acSAndroid Build Coastguard Worker 	/*
176*1c60b9acSAndroid Build Coastguard Worker 	 * test 4: use up whole free list, then recover and alloc something
177*1c60b9acSAndroid Build Coastguard Worker 	 *	   else
178*1c60b9acSAndroid Build Coastguard Worker 	 */
179*1c60b9acSAndroid Build Coastguard Worker 
180*1c60b9acSAndroid Build Coastguard Worker 	dsh = lws_dsh_create(NULL, 4096, 2);
181*1c60b9acSAndroid Build Coastguard Worker 	if (!dsh) {
182*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("%s: Failed to create dsh\n", __func__);
183*1c60b9acSAndroid Build Coastguard Worker 
184*1c60b9acSAndroid Build Coastguard Worker 		return 1;
185*1c60b9acSAndroid Build Coastguard Worker 	}
186*1c60b9acSAndroid Build Coastguard Worker 
187*1c60b9acSAndroid Build Coastguard Worker 	if (lws_dsh_alloc_tail(dsh, 0, blob, 4000, NULL, 0)) {
188*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("%s: Failed to alloc 1\n", __func__);
189*1c60b9acSAndroid Build Coastguard Worker 
190*1c60b9acSAndroid Build Coastguard Worker 		goto bail;
191*1c60b9acSAndroid Build Coastguard Worker 	}
192*1c60b9acSAndroid Build Coastguard Worker 
193*1c60b9acSAndroid Build Coastguard Worker 	if (lws_dsh_get_head(dsh, 0, &a1, &size)) {
194*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("%s: no head 1\n", __func__);
195*1c60b9acSAndroid Build Coastguard Worker 
196*1c60b9acSAndroid Build Coastguard Worker 		goto bail;
197*1c60b9acSAndroid Build Coastguard Worker 	}
198*1c60b9acSAndroid Build Coastguard Worker 	if (size != 4000) {
199*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("%s: test 1 mismatch\n", __func__);
200*1c60b9acSAndroid Build Coastguard Worker 
201*1c60b9acSAndroid Build Coastguard Worker 		goto bail;
202*1c60b9acSAndroid Build Coastguard Worker 	}
203*1c60b9acSAndroid Build Coastguard Worker 	lws_dsh_free(&a1);
204*1c60b9acSAndroid Build Coastguard Worker 
205*1c60b9acSAndroid Build Coastguard Worker 	if (lws_dsh_alloc_tail(dsh, 0, "some other string", 17, NULL, 0)) {
206*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("%s: Failed to alloc 2\n", __func__);
207*1c60b9acSAndroid Build Coastguard Worker 
208*1c60b9acSAndroid Build Coastguard Worker 		goto bail;
209*1c60b9acSAndroid Build Coastguard Worker 	}
210*1c60b9acSAndroid Build Coastguard Worker 
211*1c60b9acSAndroid Build Coastguard Worker 	if (lws_dsh_alloc_tail(dsh, 0, "hello again", 11, NULL, 0)) {
212*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("%s: Failed to alloc 3\n", __func__);
213*1c60b9acSAndroid Build Coastguard Worker 
214*1c60b9acSAndroid Build Coastguard Worker 		goto bail;
215*1c60b9acSAndroid Build Coastguard Worker 	}
216*1c60b9acSAndroid Build Coastguard Worker 
217*1c60b9acSAndroid Build Coastguard Worker 	if (lws_dsh_get_head(dsh, 0, &a1, &size)) {
218*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("%s: no head 1\n", __func__);
219*1c60b9acSAndroid Build Coastguard Worker 
220*1c60b9acSAndroid Build Coastguard Worker 		goto bail;
221*1c60b9acSAndroid Build Coastguard Worker 	}
222*1c60b9acSAndroid Build Coastguard Worker 	if (size != 17 || memcmp(a1, "some other string", 17)) {
223*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("%s: test 1 mismatch\n", __func__);
224*1c60b9acSAndroid Build Coastguard Worker 
225*1c60b9acSAndroid Build Coastguard Worker 		goto bail;
226*1c60b9acSAndroid Build Coastguard Worker 	}
227*1c60b9acSAndroid Build Coastguard Worker 	lws_dsh_free(&a1);
228*1c60b9acSAndroid Build Coastguard Worker 
229*1c60b9acSAndroid Build Coastguard Worker 	if (lws_dsh_get_head(dsh, 0, &a1, &size)) {
230*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("%s: no head 2\n", __func__);
231*1c60b9acSAndroid Build Coastguard Worker 
232*1c60b9acSAndroid Build Coastguard Worker 		goto bail;
233*1c60b9acSAndroid Build Coastguard Worker 	}
234*1c60b9acSAndroid Build Coastguard Worker 	if (size != 11 || memcmp(a1, "hello again", 11)) {
235*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("%s: test 2 mismatch (%zu)\n", __func__, size);
236*1c60b9acSAndroid Build Coastguard Worker 
237*1c60b9acSAndroid Build Coastguard Worker 		goto bail;
238*1c60b9acSAndroid Build Coastguard Worker 	}
239*1c60b9acSAndroid Build Coastguard Worker 
240*1c60b9acSAndroid Build Coastguard Worker 	lws_dsh_free(&a1);
241*1c60b9acSAndroid Build Coastguard Worker 
242*1c60b9acSAndroid Build Coastguard Worker 	lws_dsh_destroy(&dsh);
243*1c60b9acSAndroid Build Coastguard Worker 
244*1c60b9acSAndroid Build Coastguard Worker 	return 0;
245*1c60b9acSAndroid Build Coastguard Worker bail:
246*1c60b9acSAndroid Build Coastguard Worker 	lws_dsh_destroy(&dsh);
247*1c60b9acSAndroid Build Coastguard Worker 
248*1c60b9acSAndroid Build Coastguard Worker 	return 1;
249*1c60b9acSAndroid Build Coastguard Worker }
250*1c60b9acSAndroid Build Coastguard Worker 
251*1c60b9acSAndroid Build Coastguard Worker int
test5(void)252*1c60b9acSAndroid Build Coastguard Worker test5(void)
253*1c60b9acSAndroid Build Coastguard Worker {
254*1c60b9acSAndroid Build Coastguard Worker 	struct lws_dsh *dsh;
255*1c60b9acSAndroid Build Coastguard Worker 	unsigned int budget;
256*1c60b9acSAndroid Build Coastguard Worker 	uint8_t blob[4096];
257*1c60b9acSAndroid Build Coastguard Worker 	lws_xos_t xos;
258*1c60b9acSAndroid Build Coastguard Worker 	size_t size;
259*1c60b9acSAndroid Build Coastguard Worker 	void *a1;
260*1c60b9acSAndroid Build Coastguard Worker 
261*1c60b9acSAndroid Build Coastguard Worker 	memset(blob, 0, sizeof(blob));
262*1c60b9acSAndroid Build Coastguard Worker 	lws_xos_init(&xos, 0x123456789abcdef0ull);
263*1c60b9acSAndroid Build Coastguard Worker 
264*1c60b9acSAndroid Build Coastguard Worker 	budget = (unsigned int)(lws_xos(&xos) % 4000) + 4000;
265*1c60b9acSAndroid Build Coastguard Worker 
266*1c60b9acSAndroid Build Coastguard Worker 	lwsl_notice("%s: budget %u\n", __func__, budget);
267*1c60b9acSAndroid Build Coastguard Worker 
268*1c60b9acSAndroid Build Coastguard Worker 
269*1c60b9acSAndroid Build Coastguard Worker 	/*
270*1c60b9acSAndroid Build Coastguard Worker 	 * test 5: PRNG-based spamming and erratic bidi draining
271*1c60b9acSAndroid Build Coastguard Worker 	 */
272*1c60b9acSAndroid Build Coastguard Worker 
273*1c60b9acSAndroid Build Coastguard Worker 	dsh = lws_dsh_create(NULL, 409600, 2);
274*1c60b9acSAndroid Build Coastguard Worker 	if (!dsh) {
275*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("%s: Failed to create dsh\n", __func__);
276*1c60b9acSAndroid Build Coastguard Worker 
277*1c60b9acSAndroid Build Coastguard Worker 		return 1;
278*1c60b9acSAndroid Build Coastguard Worker 	}
279*1c60b9acSAndroid Build Coastguard Worker 
280*1c60b9acSAndroid Build Coastguard Worker 	do {
281*1c60b9acSAndroid Build Coastguard Worker 
282*1c60b9acSAndroid Build Coastguard Worker 		if (lws_xos_percent(&xos, 60)) {
283*1c60b9acSAndroid Build Coastguard Worker 			/* kind 0 is going to try to write */
284*1c60b9acSAndroid Build Coastguard Worker 
285*1c60b9acSAndroid Build Coastguard Worker 			size = (size_t)((lws_xos(&xos) & 127) + 1);
286*1c60b9acSAndroid Build Coastguard Worker 
287*1c60b9acSAndroid Build Coastguard Worker 			if (!lws_dsh_alloc_tail(dsh, 0, blob, size, NULL, 0))
288*1c60b9acSAndroid Build Coastguard Worker 				lwsl_notice("%s: kind 0 alloc %d\n", __func__, (int)size);
289*1c60b9acSAndroid Build Coastguard Worker 		}
290*1c60b9acSAndroid Build Coastguard Worker 
291*1c60b9acSAndroid Build Coastguard Worker 		if (lws_xos_percent(&xos, 80)) {
292*1c60b9acSAndroid Build Coastguard Worker 			/* kind 1 is going to try to write */
293*1c60b9acSAndroid Build Coastguard Worker 
294*1c60b9acSAndroid Build Coastguard Worker 			size = (size_t)((lws_xos(&xos) & 127) + 1);
295*1c60b9acSAndroid Build Coastguard Worker 
296*1c60b9acSAndroid Build Coastguard Worker 			if (!lws_dsh_alloc_tail(dsh, 1, blob, size, NULL, 0))
297*1c60b9acSAndroid Build Coastguard Worker 				lwsl_notice("%s: kind 1 alloc %d\n", __func__, (int)size);
298*1c60b9acSAndroid Build Coastguard Worker 		}
299*1c60b9acSAndroid Build Coastguard Worker 
300*1c60b9acSAndroid Build Coastguard Worker 		if (lws_xos_percent(&xos, 40)) {
301*1c60b9acSAndroid Build Coastguard Worker 			/* kind 0 is going to try to read */
302*1c60b9acSAndroid Build Coastguard Worker 
303*1c60b9acSAndroid Build Coastguard Worker 			while (!lws_dsh_get_head(dsh, 0, &a1, &size)) {
304*1c60b9acSAndroid Build Coastguard Worker 				lwsl_notice("%s: kind 0 read %d\n", __func__, (int)size);
305*1c60b9acSAndroid Build Coastguard Worker 				lws_dsh_free(&a1);
306*1c60b9acSAndroid Build Coastguard Worker 			}
307*1c60b9acSAndroid Build Coastguard Worker 		}
308*1c60b9acSAndroid Build Coastguard Worker 
309*1c60b9acSAndroid Build Coastguard Worker 		if (lws_xos_percent(&xos, 30)) {
310*1c60b9acSAndroid Build Coastguard Worker 			/* kind 1 is going to try to read */
311*1c60b9acSAndroid Build Coastguard Worker 
312*1c60b9acSAndroid Build Coastguard Worker 			while (!lws_dsh_get_head(dsh, 1, &a1, &size)) {
313*1c60b9acSAndroid Build Coastguard Worker 				lwsl_notice("%s: kind 1 read %d\n", __func__, (int)size);
314*1c60b9acSAndroid Build Coastguard Worker 				lws_dsh_free(&a1);
315*1c60b9acSAndroid Build Coastguard Worker 			}
316*1c60b9acSAndroid Build Coastguard Worker 		}
317*1c60b9acSAndroid Build Coastguard Worker 
318*1c60b9acSAndroid Build Coastguard Worker 	} while (budget--);
319*1c60b9acSAndroid Build Coastguard Worker 
320*1c60b9acSAndroid Build Coastguard Worker 	while (!lws_dsh_get_head(dsh, 0, &a1, &size)) {
321*1c60b9acSAndroid Build Coastguard Worker 		lwsl_notice("%s: kind 0 read %d\n", __func__, (int)size);
322*1c60b9acSAndroid Build Coastguard Worker 		lws_dsh_free(&a1);
323*1c60b9acSAndroid Build Coastguard Worker 	}
324*1c60b9acSAndroid Build Coastguard Worker 
325*1c60b9acSAndroid Build Coastguard Worker 	while (!lws_dsh_get_head(dsh, 1, &a1, &size)) {
326*1c60b9acSAndroid Build Coastguard Worker 		lwsl_notice("%s: kind 1 read %d\n", __func__, (int)size);
327*1c60b9acSAndroid Build Coastguard Worker 		lws_dsh_free(&a1);
328*1c60b9acSAndroid Build Coastguard Worker 	}
329*1c60b9acSAndroid Build Coastguard Worker 
330*1c60b9acSAndroid Build Coastguard Worker #if defined(_DEBUG)
331*1c60b9acSAndroid Build Coastguard Worker 	lws_dsh_describe(dsh, "test dsh end state");
332*1c60b9acSAndroid Build Coastguard Worker #endif
333*1c60b9acSAndroid Build Coastguard Worker 
334*1c60b9acSAndroid Build Coastguard Worker 	lws_dsh_destroy(&dsh);
335*1c60b9acSAndroid Build Coastguard Worker 
336*1c60b9acSAndroid Build Coastguard Worker 	return 0;
337*1c60b9acSAndroid Build Coastguard Worker }
338*1c60b9acSAndroid Build Coastguard Worker 
main(int argc,const char ** argv)339*1c60b9acSAndroid Build Coastguard Worker int main(int argc, const char **argv)
340*1c60b9acSAndroid Build Coastguard Worker {
341*1c60b9acSAndroid Build Coastguard Worker 	int logs = LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;
342*1c60b9acSAndroid Build Coastguard Worker 	int ret = 0, n;
343*1c60b9acSAndroid Build Coastguard Worker 	const char *p;
344*1c60b9acSAndroid Build Coastguard Worker 
345*1c60b9acSAndroid Build Coastguard Worker 	if ((p = lws_cmdline_option(argc, argv, "-d")))
346*1c60b9acSAndroid Build Coastguard Worker 		logs = atoi(p);
347*1c60b9acSAndroid Build Coastguard Worker 
348*1c60b9acSAndroid Build Coastguard Worker 	lws_set_log_level(logs, NULL);
349*1c60b9acSAndroid Build Coastguard Worker 	lwsl_user("LWS API selftest: lws_dsh\n");
350*1c60b9acSAndroid Build Coastguard Worker 
351*1c60b9acSAndroid Build Coastguard Worker 	n = test1();
352*1c60b9acSAndroid Build Coastguard Worker 	lwsl_user("%s: test1: %d\n", __func__, n);
353*1c60b9acSAndroid Build Coastguard Worker 	ret |= n;
354*1c60b9acSAndroid Build Coastguard Worker 
355*1c60b9acSAndroid Build Coastguard Worker 	n = test3();
356*1c60b9acSAndroid Build Coastguard Worker 	lwsl_user("%s: test3: %d\n", __func__, n);
357*1c60b9acSAndroid Build Coastguard Worker 	ret |= n;
358*1c60b9acSAndroid Build Coastguard Worker 
359*1c60b9acSAndroid Build Coastguard Worker 	n = test4();
360*1c60b9acSAndroid Build Coastguard Worker 	lwsl_user("%s: test4: %d\n", __func__, n);
361*1c60b9acSAndroid Build Coastguard Worker 	ret |= n;
362*1c60b9acSAndroid Build Coastguard Worker 
363*1c60b9acSAndroid Build Coastguard Worker 	n = test5();
364*1c60b9acSAndroid Build Coastguard Worker 	lwsl_user("%s: test5: %d\n", __func__, n);
365*1c60b9acSAndroid Build Coastguard Worker 	ret |= n;
366*1c60b9acSAndroid Build Coastguard Worker 
367*1c60b9acSAndroid Build Coastguard Worker 	lwsl_user("Completed: %s\n", ret ? "FAIL" : "PASS");
368*1c60b9acSAndroid Build Coastguard Worker 
369*1c60b9acSAndroid Build Coastguard Worker 	return ret;
370*1c60b9acSAndroid Build Coastguard Worker }
371