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