xref: /aosp_15_r20/external/libwebsockets/minimal-examples/api-tests/api-test-lwsac/main.c (revision 1c60b9aca93fdbc9b5f19b2d2194c91294b22281)
1*1c60b9acSAndroid Build Coastguard Worker /*
2*1c60b9acSAndroid Build Coastguard Worker  * lws-api-test-lwsac
3*1c60b9acSAndroid Build Coastguard Worker  *
4*1c60b9acSAndroid Build Coastguard Worker  * Written in 2010-2019 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 struct mytest {
13*1c60b9acSAndroid Build Coastguard Worker 	int payload;
14*1c60b9acSAndroid Build Coastguard Worker 	/* notice doesn't have to be at start of struct */
15*1c60b9acSAndroid Build Coastguard Worker 	lws_list_ptr list_next;
16*1c60b9acSAndroid Build Coastguard Worker 	/* a struct can appear on multiple lists too... */
17*1c60b9acSAndroid Build Coastguard Worker };
18*1c60b9acSAndroid Build Coastguard Worker 
19*1c60b9acSAndroid Build Coastguard Worker /* converts a ptr to struct mytest .list_next to a ptr to struct mytest */
20*1c60b9acSAndroid Build Coastguard Worker #define list_to_mytest(p) lws_list_ptr_container(p, struct mytest, list_next)
21*1c60b9acSAndroid Build Coastguard Worker 
main(int argc,const char ** argv)22*1c60b9acSAndroid Build Coastguard Worker int main(int argc, const char **argv)
23*1c60b9acSAndroid Build Coastguard Worker {
24*1c60b9acSAndroid Build Coastguard Worker 	int n, logs = LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE, acc;
25*1c60b9acSAndroid Build Coastguard Worker 	lws_list_ptr list_head = NULL, iter;
26*1c60b9acSAndroid Build Coastguard Worker 	struct lwsac *lwsac = NULL;
27*1c60b9acSAndroid Build Coastguard Worker 	struct mytest *m;
28*1c60b9acSAndroid Build Coastguard Worker 	const char *p;
29*1c60b9acSAndroid Build Coastguard Worker 
30*1c60b9acSAndroid Build Coastguard Worker 	if ((p = lws_cmdline_option(argc, argv, "-d")))
31*1c60b9acSAndroid Build Coastguard Worker 		logs = atoi(p);
32*1c60b9acSAndroid Build Coastguard Worker 
33*1c60b9acSAndroid Build Coastguard Worker 	lws_set_log_level(logs, NULL);
34*1c60b9acSAndroid Build Coastguard Worker 	lwsl_user("LWS API selftest: lwsac\n");
35*1c60b9acSAndroid Build Coastguard Worker 
36*1c60b9acSAndroid Build Coastguard Worker 	/*
37*1c60b9acSAndroid Build Coastguard Worker 	 * 1) allocate and create 1000 struct mytest in a linked-list
38*1c60b9acSAndroid Build Coastguard Worker 	 */
39*1c60b9acSAndroid Build Coastguard Worker 
40*1c60b9acSAndroid Build Coastguard Worker 	for (n = 0; n < 1000; n++) {
41*1c60b9acSAndroid Build Coastguard Worker 		m = lwsac_use(&lwsac, sizeof(*m), 0);
42*1c60b9acSAndroid Build Coastguard Worker 		if (!m)
43*1c60b9acSAndroid Build Coastguard Worker 			return -1;
44*1c60b9acSAndroid Build Coastguard Worker 		m->payload = n;
45*1c60b9acSAndroid Build Coastguard Worker 
46*1c60b9acSAndroid Build Coastguard Worker 		lws_list_ptr_insert(&list_head, &m->list_next, NULL);
47*1c60b9acSAndroid Build Coastguard Worker 	}
48*1c60b9acSAndroid Build Coastguard Worker 
49*1c60b9acSAndroid Build Coastguard Worker 	/*
50*1c60b9acSAndroid Build Coastguard Worker 	 * 2) report some debug info about the lwsac state... those 1000
51*1c60b9acSAndroid Build Coastguard Worker 	 * allocations actually only required 4 mallocs
52*1c60b9acSAndroid Build Coastguard Worker 	 */
53*1c60b9acSAndroid Build Coastguard Worker 
54*1c60b9acSAndroid Build Coastguard Worker 	lwsac_info(lwsac);
55*1c60b9acSAndroid Build Coastguard Worker 
56*1c60b9acSAndroid Build Coastguard Worker 	/* 3) iterate the list, accumulating the payloads */
57*1c60b9acSAndroid Build Coastguard Worker 
58*1c60b9acSAndroid Build Coastguard Worker 	acc = 0;
59*1c60b9acSAndroid Build Coastguard Worker 	iter = list_head;
60*1c60b9acSAndroid Build Coastguard Worker 	while (iter) {
61*1c60b9acSAndroid Build Coastguard Worker 		m = list_to_mytest(iter);
62*1c60b9acSAndroid Build Coastguard Worker 		acc += m->payload;
63*1c60b9acSAndroid Build Coastguard Worker 
64*1c60b9acSAndroid Build Coastguard Worker 		lws_list_ptr_advance(iter);
65*1c60b9acSAndroid Build Coastguard Worker 	}
66*1c60b9acSAndroid Build Coastguard Worker 
67*1c60b9acSAndroid Build Coastguard Worker 	if (acc != 499500) {
68*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("%s: FAIL acc %d\n", __func__, acc);
69*1c60b9acSAndroid Build Coastguard Worker 
70*1c60b9acSAndroid Build Coastguard Worker 		return 1;
71*1c60b9acSAndroid Build Coastguard Worker 	}
72*1c60b9acSAndroid Build Coastguard Worker 
73*1c60b9acSAndroid Build Coastguard Worker 	/*
74*1c60b9acSAndroid Build Coastguard Worker 	 * 4) deallocate everything (lwsac is also set to NULL).  It just
75*1c60b9acSAndroid Build Coastguard Worker 	 *    deallocates the 4 mallocs, everything in there is gone accordingly
76*1c60b9acSAndroid Build Coastguard Worker 	 */
77*1c60b9acSAndroid Build Coastguard Worker 
78*1c60b9acSAndroid Build Coastguard Worker 	lwsac_free(&lwsac);
79*1c60b9acSAndroid Build Coastguard Worker 
80*1c60b9acSAndroid Build Coastguard Worker 	lwsl_user("Completed: PASS\n");
81*1c60b9acSAndroid Build Coastguard Worker 
82*1c60b9acSAndroid Build Coastguard Worker 	return 0;
83*1c60b9acSAndroid Build Coastguard Worker }
84