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