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