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